在手动绑定的ComboBox中更改选择

时间:2010-10-11 08:52:17

标签: c# .net-3.5

我用下面的方法填充组合框,当我改变选择时,它在所有组合框中都改变了原因?

PowerProjectDBLinqDataContext dataContext =new PowerProjectDBLinqDataContext();
IEnumerable<Winding_Building_typeCombo> ls = dataContext.Winding_Building_typeCombos.ToList();
ComboBox cbx;
           for (int i = 1; i <= windingCount; i++)
           {
               cbx=((ComboBox)WindingPanel.Controls["winding" + i].Controls["cbxWindingBildingType" + i]);
               cbx.ValueMember = "id";
               cbx.DisplayMember = "value";
               cbx.DataSource = ls;
           }

3 个答案:

答案 0 :(得分:1)

答案可能不在此代码中。;

我想是因为组合框的所有组件都使用相同的引用。

你可能做过这样的事情

var combo = new ComboBox();
ComboBox cb1 = combo;
ComboBox cb2 = combo;
ComboBox cb3 = combo;

编辑:oops是的,正如另一个人说的那样,你正在设置他们所有使用相同的数据上下文。即,当您更改datacontext中的选定值时,它们将全部更新以反映其上下文 - 即选择相同的行。

cbx.DataSource = ls; 

这一行将它们全部设置为相同的东西。您需要在每种情况下获取datacontext的副本,以便每个组合指向唯一的datacontext。

试试这个

PowerProjectDBLinqDataContext dataContext =new PowerProjectDBLinqDataContext(); 
ComboBox cbx; 
           for (int i = 1; i <= windingCount; i++) 
           { 
               IEnumerable<Winding_Building_typeCombo> ls = dataContext.Winding_Building_typeCombos.ToList(); 
               cbx=((ComboBox)WindingPanel.Controls["winding" + i].Controls["cbxWindingBildingType" + i]); 
               cbx.ValueMember = "id"; 
               cbx.DisplayMember = "value"; 
               cbx.DataSource = ls; 
           } 

答案 1 :(得分:0)

我怀疑你只有一个cbx控件实例。因此,每次将cbx绑定到数据源时,实际上都会覆盖当前存在的数据绑定,最终控件将仅绑定到最后一个数据源。

答案 2 :(得分:0)

我试过这个方法并且它正在工作我在Context的位置创建了一个列表的图像以节省时间和内存


PowerProjectDBLinqDataContext dataContext =new PowerProjectDBLinqDataContext();
            IEnumerable<Winding_Building_typeCombo> ls = dataContext.Winding_Building_typeCombos.ToList();
            ComboBox cbx;
           for (int i = 1; i <= windingCount; i++)
           {
               IEnumerable<Winding_Building_typeCombo> lsCopy = new List<Winding_Building_typeCombo>(ls);
               cbx=((ComboBox)WindingPanel.Controls["winding" + i].Controls["cbxWindingBildingType" + i]);
               cbx.DataSource = lsCopy;
               lsCopy = null;
               cbx.ValueMember = "id";
               cbx.DisplayMember = "value";
           }