使用 DataBinding 维护列表框之间的字母短

Use DataBinding to maintain the alphabetic short between listBoxes

我一直在使用 c# (.NET FRAMEWORK) 在 Visual Studio 中编写一些小项目,在我的一些 windows 表单中,我想在不同的 lisboxes 中显示有关某个对象的信息。

在我的程序中,我得到了一个名为 Client 的 class,它具有一些属性:一个名为 DNI 的整数(这是标识客户端的那个),一个名为 Name 和一个名为 Telephone 的整数。我想要一个表单来显示 3 个不同的列表框,每个列表框都有一个 Client 对象集合的元素列表。关键是 Client 对象的属性显示在每个 listBox 的相同索引中(也就是说,水平阅读您会看到属性的三个值)。我在每个列表框的顶部实现了一个按钮,按字母顺序对 listBox 的元素进行排序,但我想在它们之间进行绑定,所以当你按字母顺序对一个列表框进行排序时,另外两个对它们的元素进行排序以匹配元素的新顺序在按字母顺序排序的那一个中。

有人告诉我 class DataBindings 可以用来执行此操作。我曾尝试在互联网上搜索有关它的信息,但一无所获,阅读文档也无济于事,所以我最终将其发布在这里。我如何使用 DataBindings 来解决这个问题?任何帮助或提示将不胜感激,提前致谢。

如果您已经为每个按钮实现了一个按钮,那么您就快完成了。

每个 ListBox 都必须绑定一个 List of Client,显示特定 属性 作为 DisplayMember。

每个ListBox的按钮可以对List进行排序和刷新所有的ListBox。 如果您需要更多信息,请 post 您的一些代码。

What must I write to bind the indexes of them?

我推荐了一个datagridview;您似乎有想要以表格方式显示的表格数据。但是,我们将演示所有数据。

最简单的路线:

  • 创建一个新的 winforms 项目
  • 添加一个DataSet类型的文件,打开它,右击设计图面并选择Add .. DataTable
  • 为 table 客户命名
  • 右键添加列,命名为DNI,使用props grid使其类型为Int32
  • 添加字符串列名称
  • 添加一个 int 列 Telephone
  • 保存,切换到 Form1 设计器
  • 打开数据源window(查看菜单,其他Windows)
  • 将客户端节点拖到窗体上。数据网格视图与托盘中的一些内容一起出现。删除导航器;在这种情况下它不是很有用
  • 向表单添加 3 个列表框
  • 对于每个列表框:
    • 使用道具网格将其数据源设置为绑定源
    • 将 DisplayMember 设置为不同的列 - 一个 DNI,另一个名称和第三个电话

暂时就这些,运行 应用程序。在数据网格视图中键入一些数据。请注意,当您通过单击 DGV header 进行排序时,列表框随之而来;这是因为排序指令是由绑定源执行的,所有控件都通过绑定源进行绑定:

这就是通过绑定源绑定到强类型数据的东西table,这在概念上与您所拥有的并没有什么不同。在设计界面中制作 table 及其列的工作在概念上等同于制作具有属性的 class。实际上,如果您要打开 DataSetBlahBlah.Designer.cs 文件,您会发现一个具有 3 个属性的 class ClientRow DNI, Name, Telephone

您可以更改您所做的一切以基于例如a List<Client> 但您的排序生活变得稍微尴尬,因为 BindingSource 不了解如何对其进行排序。因此你最终会得到类似的东西:

//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

就我个人而言,我会将其保留为强类型数据table;对于你想要的 List<Client>ClientRowClientDataTable collection 表面足够相似..

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

等等