对数据绑定组合框进行排序的最佳方法是啥?
Posted
技术标签:
【中文标题】对数据绑定组合框进行排序的最佳方法是啥?【英文标题】:What is the best way to sort a data bound combo box?对数据绑定组合框进行排序的最佳方法是什么? 【发布时间】:2010-09-06 23:33:56 【问题描述】:我对此进行了一些研究,似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序(在本例中为 DataSet 中的 DataTable)。
如果是这样,那么问题就变成了对 DataTable 进行排序的最佳方法是什么?
组合框绑定在设计器中设置初始化使用
myCombo.DataSource = this.typedDataSet;
myCombo.DataMember = "Table1";
myCombo.DisplayMember = "ColumnB";
myCombo.ValueMember = "ColumnA";
我试过设置
this.typedDataSet.Table1.DefaultView.Sort = "ColumnB DESC";
但这没有什么区别,我尝试在 typedDataSet.Merge 调用之前和之后在控件构造函数中设置它。
【问题讨论】:
【参考方案1】:如果您使用的是 DataTable,则可以使用 (DataTable.DefaultView) DataView.Sort 属性。为了获得更大的灵活性,您可以使用BindingSource 组件。 BindingSource 将是您的组合框的数据源。然后,您可以将数据源从 DataTable 更改为 List,而无需更改组合框的 DataSource。
BindingSource 组件服务于 许多目的。首先,它简化了 将表单上的控件绑定到数据 提供货币管理、找零 通知和其他服务 Windows 窗体控件和 数据源。
【讨论】:
【参考方案2】:您实际上可以在 DataTable 上对 default view 进行排序:
myDataTable.DefaultView.Sort = "Field1, Field2 DESC";
这将对您直接从 DataTable 检索到的所有行进行排序。
【讨论】:
【参考方案3】:确保在设置 Sort 属性后将 DefaultView 绑定到 Controls 数据源,而不是表:
myCombo.DataSource = this.typedDataSet.Tables["Table1"].DefaultView;
myCombo.DisplayMember = "ColumnB";
myCombo.ValueMember = "ColumnA";
【讨论】:
【参考方案4】:Josh Smith 有一个 blog post 可以回答这个问题,并在 XAML 中完成。
【讨论】:
【参考方案5】:数据是否需要在 DataTable 中? 使用 SortedList 并将其绑定到组合框会更简单。
如果需要使用 DataTable,可以使用 Select 方法检索 DataView 并传入排序参数。
DataView dv = myDataTable.Select("filter expression", "sort");
【讨论】:
【参考方案6】:对 ComboBox 进行排序的最简单方法是使用 ComboBox.Sorted 属性。但是,如果您使用数据绑定,这将不起作用。在这种情况下,您必须对数据源本身进行排序。
您可以使用SortedList 或SortedDictionary(均按Key 排序)或DataView。
DataView 有一个Sort 属性,它接受一个排序表达式(字符串),例如:
view.Sort = "State, ZipCode DESC";
在上面的示例中,State 和 ZipCode 都是 DataTable 中用于创建 DataView 的列。
【讨论】:
【参考方案7】:我知道您已经选择了对这个问题的答案,但我会建议在您的表单上放置一个 DataView,将其绑定到您的 DataSet/DataTable,并在设计器中的 View 上设置排序。然后将组合框绑定到 DataView,而不是 DataSet/DataTable。
【讨论】:
以上是关于对数据绑定组合框进行排序的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
将数据绑定到 ReportViewer 控件的最佳方法是啥? (DataAdapter 与 DataReader)
在 WinForms 中对一组单选按钮进行数据绑定的最佳方法