Use DataBinding to maintain the alphabetic short between listBoxes

I've been programming some little project in Visual Studio using c# (.NET FRAMEWORK) and in some of my windows forms I want to show in different lisboxes the information about some object.

In my program I got a class named Client that has some Properties: an int called DNI (this is the one that identifies a Client), a string called Name and an int called Telephone. I want a form to show 3 different listboxes, each one with the list of elements of a collection of Client objects. The point is that a Client object has it's Properties showed in the same index of each listBox (to be said, reading horizontally you see the three values of the properties). I have implemented a button in top of each one that alphabetically sorts the elements of the listBox, but I would like to make a Binding between them so When you alphabetically sort one listbox, the other two sort their elements to match the new order of elements in the one alphabetically sorted.

I've been told the class DataBindingscan be used to do this. I've tried searching on the internet about it but achieved nothing and reading the documentation didn't help either, so I ended up posting it here. How can I use DataBindings to solve this? Any help or hint will be appreciated, thanks in advance.

Upvotes: 0

Views: 130

Answers (2)

Caius Jard
Caius Jard

Reputation: 74605

What must I write to bind the indexes of them?

I recommended a datagridview; you seem to have tabular data that you want to show in a tabular fashion.. However, we'll demo all of it.

Easiest route:

  • Make a new winforms project
  • Add a DataSet type of file, open it, right click the design surface and choose Add .. DataTable
  • Name the table Client
  • Right click it and add column, call it DNI, use the props grid to make its type Int32
  • Add a string column Name
  • Add an int column Telephone
  • Save, switch to Form1 designer
  • Open Data Sources window (View menu, Other Windows)
  • Drag the Client node onto the form. A datagridview appears along with some stuff in the tray. Remove the navigator; it's not so useful in this context
  • Add 3 listboxes to the form
  • For each listbox:
    • Use the props grid to set its DataSource to the bindingsource
    • Set the DisplayMember to a different column - one DNI, the other Name and the third Telephone

That's it for now, run the app. Type some data in the datagridview. Note that when you sort by clicking the DGV header, the listboxes follow; this is because the sort instruction is being carried out by the bindingsource, and all controls bind through the bindingsource:

enter image description here

So that's thngs bound through a bindingsource to a strongly typed datatable, which is conceptually not really any different to what you have. The bit of work making the table and its columns in the design surface is the notional equivalent of making a class with properties. Indeed if you were to open the DataSetBlahBlah.Designer.cs file you'd find a class ClientRow with 3 properties DNI, Name, Telephone

You could change up everything you've made to be based on e.g. a List<Client> but your sorting life becomes slightly more awkward because a BindingSource doesn't understand how to sort it. As such you'd end up with something like:

//class property
private List<Client> Clients = new();

//in constructor
clientBindingSource.DataSource = Clients;

//in button that does sorting:
clientBindingSource.DataSource = Clients.OrderBy(c => c.name); //etc

Personally I'd leave it as a strongly typed datatable; for what you'd want out of a List<Client> a ClientDataTable collection of ClientRow are surface similar enough..

Clients.Where(c => c.Name == "John"); //how you might search a List<client>
ClientsDT.Where(c => c.Name == "John"); //how you might search a ClientDataTable

Clients.Add(new Client(){ DNI = 1, Name = "a", Telephone = 1 } ); //add to a List<Client>
ClientsDT.AddClientsRow(1, "a", 1); //how you might add to a ClientDataTable

etc

Upvotes: 1

Salvatore Giuffrida
Salvatore Giuffrida

Reputation: 73

If you have already implemented a button for each, you've almost finished.

Every ListBox have to be bound with a List of Client, showing a specific property as DisplayMember.

The button of each ListBox can sort the List and refresh all of the ListBoxes. If you want more information, please post some of your code.

Upvotes: 0

Related Questions