【问题标题】:Binding one ListItem to multiple dropdown in .NET Form将一个 ListItem 绑定到 .NET 表单中的多个下拉列表
【发布时间】:2012-08-31 19:23:41
【问题描述】:

也许这对你们 .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;

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

谢谢

【问题讨论】:

  • 这是 WPF 吗?我用 ListView 做到这一点没有问题。
  • 这不是 WPF。我并没有说它不起作用。它正在工作,但我想问是否有更好的方法来处理这种情况。

标签: c# .net winforms binding


【解决方案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 或者使用其他任何方式来创建一个浅拷贝。

【讨论】:

  • 谢谢! “AsReadOnly”正是我正在寻找的那种东西。
【解决方案2】:

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

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

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

【讨论】:

  • 我试过了,但它不起作用。是的,当其中一个更改但它们不再绑定时,3 个下拉列表不会更改(它们都从 N/D 而不是它们的值开始)。无论如何谢谢:)
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多