为什么加载组合框的事件不保存列表?

时间:2014-08-07 12:10:40

标签: c# .net list hashset loaded

我上课说A级,我已经在结构中给了一个列表(我正在使用HashSet),以便能够访问整个程序。

我在comboBox的Loaded事件中的列表中添加项目。 Ans我在加载的事件后使用了保存的列表,我发现它不包含我添加的数据。

这件事是否正常加载事件?有人可以告诉我在加载的事件中保存列表中的数据(我使用HashSet)吗? 我的代码是:

 static HashSet < string > listOfUpdatedUIElement = new HashSet < string > ();
 static HashSet < string > storeUpdatedUIElement = new HashSet < string > ();
  //This in constructor
 GenerateParametersPreview() 
 {
     storeUpdatedUIElement = null;
 }


 public Grid simeFunction() {
     ComboBox cmb = new ComboBox();
     cmb.Loaded += (o3, e) => {
         foreach(string atrb in listOfUpdatedUIElement) //I have seen on debugging the data are updated in listOfUpdatedUIElement 
             {
                 storeUpdatedUIElement.Add(atrb);
             }
     };

     foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
         {
             cmb.Items.Add(atrb);
         }
     Grid.SetColumn(cmb, 1);
     comboRowGrid.Children.Add(cmb);
     Grid.SetRow(comboRowGrid, 0);
     bigGrid.Children.Add(comboRowGrid); //suppose ihad created this bigGrid and it will dispaly my comboBox
     return (bigGrid);
 }

2 个答案:

答案 0 :(得分:1)

simeFunction使用的新组合框从未添加到您的表单中。

您希望在加载此组合框时填充列表,并且由于它从未添加到您的表单中,因此永远不会加载它。

答案 1 :(得分:1)

事件是Event-driven-programming范例的主要工具。

在事件驱动编程中,您不确定何时以及是否有一些条件更改(例如某些ComboBox最终加载),您正在对有关该更改的通知作出反应 - 引发事件。

这意味着

cmb.Loaded += (o3, e) =>
       {
         foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
         {
             storeUpdatedUIElement.Add(atrb);
         }
     };

之前执行(至少几乎不可能)
 foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
 {
     cmb.Items.Add(atrb);
 }

这就是为什么storeUpdatedUIElement在循环枚举时为空的原因。

<强> SOLUTION:

因此,如果您要更新ComboBox事件中的Loaded项,则应将所有相关代码放入事件中:

cmb.Loaded += (o3, e) =>
{
     foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
     {
         storeUpdatedUIElement.Add(atrb);
     }

     foreach(string atrb in storeUpdatedUIElement) //Here storeUpdatedUIElement hashset contains nothing inside
     {
         cmb.Items.Add(atrb);
     }  
};

P.S。:在这种情况下,您应该将这两个循环合二为一:

     foreach(string atrb in listOfUpdatedUIElement)//I have seen on debugging the data are updated in listOfUpdatedUIElement 
     {             
         storeUpdatedUIElement.Add(atrb); // Remove it too if it is not used anywhere else
         cmb.Items.Add(atrb);
     }