在C#winforms应用程序中使用来自EntityDataModel的数据加载组合框时,SelectedValueChange事件的意外行为

时间:2016-12-05 12:11:46

标签: c# winforms entity-framework

我使用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个正确加载选定值

enter image description here

1)如何防止选定值更改事件显示完整数据行并仅显示第一项中的选定值? 2)为什么仅针对第一项(Customer4)触发所有事件?

1 个答案:

答案 0 :(得分:2)

事件仅针对所选项目触发,在您的情况下,该项目是第一项(Customer4)。事件触发的次数与列表中项目的数量无关,但与您执行的数据绑定相关的属性分配的次数无关。在您的情况下,当您分配DataSource(1),然后分配ValueMember时(2次 - 在设置属性之前为1,之后为1),最后在您设置DisplayMember时,它会触发(1),总共4次。

我同意它并不那么聪明,但请注意,数据绑定可以在ValueMemberDisplayMember中没有一个或两个设置的情况下工作,从而产生不同的行为。因此,当任何可能影响属性被修改时,他们决定触发该事件。

所以没有办法只让它开火一次。但是,可以通过在 ValueMember之前指定DisplayMemberDataSource 来减少为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());
}