我使用Windows Forms C#应用程序使用linq到实体加载组合框中的数据
private void Form1_Load(object sender, EventArgs e)
{
MyEntityDataModel db = new MyEntityDataModel();
var q = from a in db.Customers orderby a.CustomerID descending select new { ID = a.CustomerID, Name = a.Name.Trim() };
comboBox1.DataSource = q.ToList();
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Name";
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
listBox1.Items.Add(comboBox1.SelectedValue.ToString());
}
运行代码时,首次加载数据时,所选值会更改列出的4个客户的4个事件,但仅针对Customer4触发所有事件;其中2个将显示成员加载为完整数据行,而另外2个正确加载选定值
1)如何防止选定值更改事件显示完整数据行并仅显示第一项中的选定值? 2)为什么仅针对第一项(Customer4)触发所有事件?
答案 0 :(得分:2)
事件仅针对所选项目触发,在您的情况下,该项目是第一项(Customer4)。事件触发的次数与列表中项目的数量无关,但与您执行的数据绑定相关的属性分配的次数无关。在您的情况下,当您分配DataSource
(1),然后分配ValueMember
时(2次 - 在设置属性之前为1,之后为1),最后在您设置DisplayMember
时,它会触发(1),总共4次。
我同意它并不那么聪明,但请注意,数据绑定可以在ValueMember
和DisplayMember
中没有一个或两个设置的情况下工作,从而产生不同的行为。因此,当任何可能影响属性被修改时,他们决定触发该事件。
所以没有办法只让它开火一次。但是,可以通过在 ValueMember
之前指定DisplayMember
和DataSource
来减少为2次调用(我总是将此作为经验法则使用):
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Name";
comboBox1.DataSource = q.ToList();
另外,您应该为SelectedValue
null
添加一个检查,以避免NullReferenceException
(这通常很好,因为它不仅可能发生在数据绑定方案中):
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedValue != null)
listBox1.Items.Add(comboBox1.SelectedValue.ToString());
}