Sorted为true时,SelectedValue出现问题(组合框)

时间:2019-06-25 17:20:09

标签: c# winforms sorting combobox

ComboBox.Sorted设置为true时,ComboBox.SelectedValue返回的值不同于可见选择的值。

加载项目并显示:

using (ModelContext model = new ModelContext())
{
    cbWorker.ValueMember = "IdWorker";
    cbWorker.DisplayMember = "FullName";

    bindingWorker.DataSource = model.Workers.Select(x => new ItemWorker{
            IdWorker = x.Id,
            FullName = x.FullName
        })
        .ToList();

    cbWorker.DataSource = bindingWorker;
}

private void CbWorker_SelectedValueChanged(object sender, EventArgs e)
{
    object x = cbWorker.SelectedValue;
    if (x!= null) label.Text = x.ToString();
}

如果ComboBox.Sorted = falseSelectedValue正常:

enter image description here

但是如果ComboBox.Sorted = trueSelectedValue不好,那么

enter image description here

可以修复它吗?例如,CheckedListBox也有类似的问题。

1 个答案:

答案 0 :(得分:1)

ComboBox.Sorted设置为false并按bindingWorker.DataSource属性对IdWorker进行排序:

cbWorker.Sorted = false;

...

bindingWorker.DataSource = model.Workers.Select(x => new ItemWorker{
            IdWorker = x.Id,
            FullName = x.FullName
        })
        .OrderBy(x => x.IdWorker)
        .ToList();

cbWorker.DataSource = bindingWorker;

cbWorker.ValueMember = "IdWorker";
cbWorker.DisplayMember = "FullName";

说明:

您的示例中有两个问题:

  1. 设置ComboBox。在数据绑定的ComboBox上设置为true
  2. 使用ComboBox对ComboBox项进行数字排序。排序

设置ComboBox。在数据绑定的ComboBox上设置为true

摘自ComboBox.Sorted Property文档:

  

尝试在数据绑定控件上设置Sorted属性   一个ArgumentException。您必须使用基础数据对数据进行排序   模型。

在数据绑定的ComboBox.Sorted上将true设置为ComboBox可能不是一个好主意。即使它没有引发异常,也可能导致意外行为。

使用ComboBox.Sorted对ComboBox项进行数字排序

一个简单的测试可以证明如果ComboBox.Sorted = true

  • 项目按ComboBox.DisplayMember
  • 排序
  • 项目按字符串排序(类似item.ToString()

这意味着即使ComboBox.DisplayMember是数字类型,也将在对每个数字调用ToString()之后对其进行排序,因此项目将按字母顺序排序,而不是数字。

例如,如果将数字10, 1, 3直接排序为数字值,则将它们排序为1, 3, 10,但是如果将数字首先转换为字符串("10", "1", "3")而不是排序,它们将按字母顺序排序为"1", "10", "3"

结论

如果您想:

  • 将数据绑定到ComboBox
  • 不按字母顺序对ComboBox项目进行排序
  • DisplayMember以外的成员排序

您必须先对项目进行排序,然后再将项目设置为ComboBox.DataSource并将ComboBox.Sorted设置为false