2016-12-05 187 views
1

我使用Windows使用LINQ to實體意外的行爲

 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()); 
     } 

當運行代碼形式C#應用程序的加載數據的組合框,上加載數據第一次,選定的價值改變了4個顧客列出的消費4事件,但所有消費者都只爲Customer4開火;其中2負載顯示部件作爲完整的數據行,而其他2負載選定的值正確地

enter image description here

1)如何防止選定的值改變事件從僅示出在第一項完整的數據行,並顯示選擇的值? 2)爲什麼所有的事件只爲第一個項目(客戶4)被解僱?

+0

問題是什麼? –

+0

1)如何防止選定的值更改事件顯示完整的數據行並僅顯示第一項中的選定值? 2)爲什麼所有的事件只爲第4項產生? – EgyEast

+1

如果事件提升了3次,那沒問題。第三次列表中的第一項,第一次設置'DataSource',第二次設置'ValueMember'成員和第三次'DisplayMember'。 –

回答

2

事件只會觸發選定的項目,在您的情況下是第一個項目(Customer4)。事件觸發次數與列表中項目的數量無關,而是與您執行的數據綁定相關的屬性分配的次數。在你的情況下,當你指定DataSource(1)時觸發,然後當你指定ValueMember(2次 - 一個在設置屬性之前,一個在之後),最後當你設置DisplayMember(1),總共4次。

我同意它不是那麼聰明,但請注意,數據綁定可以在沒有設置其中一個或兩個ValueMemberDisplayMember的情況下工作,從而產生不同的行爲。因此,他們決定在影響財產的任何潛在修改時觸發該事件。

所以沒有辦法讓它燃燒一次。但它可以通過DataSource之前分配ValueMemberDisplayMember減少到2個呼叫(我一直用這個作爲經驗法則):

comboBox1.ValueMember = "ID"; 
comboBox1.DisplayMember = "Name"; 
comboBox1.DataSource = q.ToList(); 

你也應該爲了避免NullReferenceException添加支票SelectedValuenull (這通常很好,因爲它不僅可以發生在數據綁定場景中):

private void comboBox1_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if (comboBox1.SelectedValue != null) 
     listBox1.Items.Add(comboBox1.SelectedValue.ToString()); 
} 
+1

太好了。非常感謝您的明智和明確的答案 – EgyEast