将一个ListItem绑定到.NET窗体中的多个下拉列表

时间:2012-08-31 19:23:42

标签: c# .net winforms binding

对于.NET家伙来说,这可能是一个非常简单的问题,但由于我来自MFC C ++开发团队,这种行为都让我们的开发团队想知道发生了什么。 (在MFC中,当我们创建下拉数据源时,源是共享的,但每个下拉列表的值不受影响)

这是一个非常简单的情况。我的表格中有3个下拉列表要求街道。你所在的街道和其他2条最近的街道。这些下拉列表中的每一个都具有相同的数据源。所以我们所做的就是(顺便说一下,ComboList只是一个继承ListItem的类,还有更多的函数)

//Combo Street
ComboList cboNomRue = new ComboList();
Tools.GetCombo(cboNomRue, Tools.ComboTypeRt.RT_NOM_RUE, true, true);
ddlNomRue.DisplayMember = "Numero";
ddlNomRue.ValueMember = "ID";
ddlNomRue.DataSource = cboNomRue;

//Combo Street From
ddlDe.DisplayMember = "Numero";
ddlDe.ValueMember = "ID";
ddlDe.DataSource = cboNomRue;

//Combo Street To
ddlA.DisplayMember = "Numero";
ddlA.ValueMember = "ID";
ddlA.DataSource = cboNomRue;

使用此代码,当用户更改ddlNomRue中的值时,3下拉列表会更改为该值!所以为了解决这个问题,我做到了。

//Combo Street
ComboList cboNomRue = new ComboList();
Tools.GetCombo(cboNomRue, Tools.ComboTypeRt.RT_NOM_RUE, true, true);
ddlNomRue.DisplayMember = "Numero";
ddlNomRue.ValueMember = "ID";
ddlNomRue.DataSource = cboNomRue;

ComboList cboNomRue2 = new ComboList(cboNomRue);
ComboList cboNomRue3 = new ComboList(cboNomRue);

//Combo Street From
ddlDe.DisplayMember = "Numero";
ddlDe.ValueMember = "ID";
ddlDe.DataSource = cboNomRue2;

//Combo Street To
ddlA.DisplayMember = "Numero";
ddlA.ValueMember = "ID";
ddlA.DataSource = cboNomRue3;

我不喜欢这个,因为当只需要一个变量时,它就是重复变量。这是处理这种情况的好方法还是我还能做什么呢?

由于

2 个答案:

答案 0 :(得分:1)

我不清楚你使用的ComboList类,但是如果使用List来存储要在comboBox中显示的项目是更好的选择。

由于一次又一次地创造物体,你所采用的方式并不好。要解决这个问题,请使用List并将其命名为AsReadOnly();

示例:

  List<string> Mylist = new List<string>();
            Mylist.Add("salman");
            Mylist.Add("khan");
            Mylist.Add("yousafzai");
            Mylist.Add("ranizai");
            Mylist.Add("kachokhail");




            this.tUsersTableAdapter.Fill(this.dbAIASDataSet.tUsers);
            comboBox1.DataSource = Mylist.AsReadOnly();
            comboBox1.DisplayMember = "ID";
            comboBox1.ValueMember = "ID";


           comboBox2.DataSource = Mylist.AsReadOnly();
           comboBox2.DisplayMember = "ID";
           comboBox2.ValueMember = "ID";

但是如果你必须使用ComboList的Object,那么在ComboList中实现icloneable接口或使用任何其他方式来创建浅拷贝。

答案 1 :(得分:0)

表单自动为表单上支持数据绑定的所有对象创建默认BindingContextBindingContext允许表单知道该对象中集合条目的计数和当前位置。当您在第一个列表中选择一个项目时,您可以更改其位置,并且由于其他两个控件都使用相同的BindingContext绑定,因此它们也会更改。要解决此问题,只需为每个控件创建一个不同的BindingContext,如下所示:

ddlNomRue.BindingContext = new BindingContext();
ddlDe.BindingContext = new BindingContext();
ddlA.BindingContext = new BindingContext();

现在,您可以将相同的ComboList绑定到所有三个控件,您仍然可以获得所需的行为。