将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 = false
,SelectedValue
正常:
但是如果ComboBox.Sorted = true
,SelectedValue
不好,那么
可以修复它吗?例如,CheckedListBox
也有类似的问题。
答案 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";
您的示例中有两个问题:
尝试在数据绑定控件上设置Sorted属性 一个ArgumentException。您必须使用基础数据对数据进行排序 模型。
在数据绑定的ComboBox.Sorted
上将true
设置为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