ComboBox DisplayMember无法赋值的问题

博客讨论了在C#中ComboBox DisplayMember无法赋值的问题,特别是在设置DataSource后。作者通过Resharper查看源码,发现DisplayMember不能直接赋值,而ValueMember可以。文章提到了一个可能的解决方案,并在后续更新中引用了MSDN文档,详细解释了DataSource和DisplayMember的关系以及触发的事件。最后,作者揭示了问题的根源在于特定条件下的DataSource变更会导致DisplayMember变为空字符串。
摘要由CSDN通过智能技术生成

我的遇到的例子是两个combobox的联动,类似地址的选择,在选择了国家之后就出现省份一样。这个可以参考(遇到的问题的描述,和最后一个回帖是一样的

我是用resharp(一个非常好用的vs插件)查看了代码之后,得出的结论:

一开始我的代码是这个顺序的:

<pre name="code" class="csharp">cb_goodsType.DisplayMember = "Value";
        cb_goodsType.ValueMember = "Key";
        cb_goodsType.DataSource = goodsTypeList;
修改后的顺序是这样的
cb_goodsType.DataSource = goodsTypeList;
                cb_goodsType.DisplayMember = "Value";
                cb_goodsType.ValueMember = "Key";


 

就是datasource的顺序掉到了最前面。想快速解决问题的可以这样试试,想知道原因的继续向下看(源代码也是一知半解):

DisplayMember不可以赋值,但ValueMember是可以赋值的,那么自然想到displayMember的设置肯定有问题,去看看源码:、

public string DisplayMember
    {
      get
      {
        return this.displayMember.BindingMember;
      }
      set
      {
        BindingMemberInfo bindingMemberInfo = this.displayMember;
        try
        {
          this.SetDataConnection(this.dataSource, new BindingMemberInfo(value), false);
        }
        catch
        {
          this.displayMember = bindingMemberInfo;
        }
      }
    }

在这里可以看到里面有一个try,catch在里面有一个setDataConnection,里面肯定有问题,应该是throw了什么异常,再进入去看:

private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force)
    {
      bool flag1 = this.dataSource != newDataSource;
      bool flag2 = !this.displayMember.Equals((object) newDisplayMember);
      if (this.inSetDataConnection)
        return;
      try
 
为了实现这样的功能,你可以使用Windows Forms或WPF的ComboBox组件,配合数据绑定和事件处理机制来联动显示数据。以下是基本步骤: 1. **设置数据源**: - 创建一个包含所有选项的数据模型,比如DataTable、List<T>或者Dictionary<String, List<String>>,其String可以代表表头名称如'a', 'b', 'c', 'd'。 2. **初始化ComboBox**: - 对于每个ComboBox设置它的DataSource属性指向这个数据源,并设置DisplayMember属性(用于显示在下拉列表的字段)和ValueMember属性(用于关联数据库的键)。 ```xml <ComboBox x:Name="comboBox1" DataSource="{Binding YourDataSource}" DisplayMember="HeaderA" ValueMember="ValueA"/> ``` 3. **设置联动**: - 当一个ComboBox的SelectionChanged事件触发时,遍历其他ComboBox并更新它们的DataSource,只显示与当前选项相关的数据。 ```csharp private void comboBox1_SelectionChanged(object sender, EventArgs e) { // 获取当前选的值 string selectedValue = comboBox1.SelectedValue.ToString(); // 更新其他ComboBox数据源,这里假设其他三个是comboBox2, comboBox3, comboBox4 comboBox2.DataSource = dataSourcefilteredBySelectedValue(selectedValue); comboBox3.DataSource = dataSourcefilteredBySelectedValue(selectedValue); comboBox4.DataSource = dataSourcefilteredBySelectedValue(selectedValue); // 保持原始未选择的选项显示 foreach (var comboBox in new ComboBox[] { comboBox2, comboBox3, comboBox4 }) { if (!string.IsNullOrEmpty(comboBox.SelectedValue)) break; comboBox.SelectedIndex = 0; // 如果已过滤完则选择第一个未选择的选项 } } private DataTable dataSourcefilteredBySelectedValue(string value) { // 根据value筛选出匹配的数据并返回 } ``` 4. **初始状态**: - 初始化时,可以直接设置默认的ComboBox选项,比如在构造函数或窗体加载事件设置。 ```csharp public Form1() { InitializeComponent(); comboBox1.SelectedValue = "初始值"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值