【问题标题】:ComboBox Issue: Cannot bind to new value member组合框问题:无法绑定到新值成员
【发布时间】:2012-03-14 08:38:12
【问题描述】:

我有一个作为用户控件创建的组合框(它实际上由标签、组合框和文本框组成)。我正在尝试将数据集绑定到组合框数据源,但我不断收到关于 ValueMember/Display 成员的错误消息:

Cannot bind to the new display member - newdisplay member
Cannot bind to the new value member - parameter name: value

我以为我已经为用户控件正确编码了所有内容:

   public partial class ucComboBox : UserControl
{
    #region Properties (6) 
    private bool isEditableReadOnly;
    private bool ArrVisible;
    private string _value;
    private string _name;

    public string value
    {
        get { return _value ; }
        set { _value = value; }
    }
    public string name
    {
        get { return _name; }
        set { _name = value; }
    }
}

我在用户控件中有一些其他属性和事件,但它们不应该是问题。

我绑定信息的代码:

  ((ucComboBox)ctrl).combobox.DataSource = info;
  ((ucComboBox)ctrl).combobox.ValueMember = "radiology_id";
  ((ucComboBox)ctrl).combobox.DisplayMember = "radiology_name";

每当它击中 value 成员时它就会爆炸,我得到了上面提到的两个错误。我的用户控件中是否缺少某些内容?在我看来这应该可以工作..(仅供参考 - 信息数据源确实包含两列)

我尝试了很多不同的策略,但都没有成功。请帮忙!

谢谢

【问题讨论】:

  • 什么是info?您绝对确定其中存储的任何内容都有公共radiology_id 和radiology_name?
  • 我很肯定。我在设置之前查看数据集。
  • info 是数据集还是数据表?如果是 DataSet,则必须将 DataSource 设置为所需的 DataTable:DataSource = info.Tables[0];
  • 这里的数据源究竟是什么?数据绑定与 source 相关,这是您还没有真正告诉我们的一件事……坦率地说,ucControlBox 在这里无关紧要。我们需要知道:究竟是什么?
  • @kevev22 或列表或单个对象或延迟列表或绑定源抽象或...

标签: c# winforms user-controls combobox


【解决方案1】:

下面的代码片段肯定会导致问题吗?

public string value
{
    get { return _value ; }
    set { _value = value; }
}

您需要将其命名为其他名称,例如组合值。 “value”表示传递给属性声明的隐式变量。

public string comboValue
{
    get { return _value ; }
    set { _value = value; }
}

【讨论】:

  • 虽然命名“价值”是一个不好的选择,但我认为这无关
  • 您能否显示数据源的代码,即包含radiology_id 和radiology_name 属性的信息对象? (如果不是,那将是它不起作用的原因......)
  • @MarcGravell - 好点;我什至从来没有尝试将属性命名为“值”,因此它分散了我对潜在缺失信息的注意力——数据源是什么以及它有什么属性...
【解决方案2】:

我认为您的组合的 Modifiers 属性不同于 Public
但是,我将选择在用户控件级别实现两个新的公共属性。
DisplayMemberValueMember 只是为了避免这种丑陋的演员表。
在 set/get 访问器中,我将在/从内部组合

public string DisplayMember
{ 
    get { return combobox1.DisplayMember; } 
    set { combobox1.DisplayMember = value;} 
} 
public string ValueMember 
{ 
    get { return combobox1.ValueMember; } 
    set { combobox1.ValueMember = value;} 
} 

【讨论】:

  • 曾经试过这个,但我认为我没有覆盖正确的名称。将再次努力。
  • 仍然不喜欢那个代码。运行这些属性时收到相同的错误消息...呃。
  • 能否请您在您的用户控件的designer.cs 中显示相关代码?这里有些不对劲。
【解决方案3】:

不再使用数据集。创建了一个包含 ID 和 Name 值的类(“Facilities”)。将“信息”更改为列表类型。然后下面的代码就可以正常工作了:

info.Add(new Facilities { ID = dr["other_facility_id"].ToString(), Name = dr["other_facility_name"].ToString() });

  ((ucComboBox)ctrl).combobox.DataSource = new BindingSource(info, null);//info;
  ((ucComboBox)ctrl).combobox.ValueMember = "ID";
  ((ucComboBox)ctrl).combobox.DisplayMember = "Name";

绑定没有问题。

【讨论】:

  • 我的 Id 属性上有一个带有 [Browsable(false)] 属性的类,这似乎导致 ValueMember 抛出此错误。这个问题可能有点晚了,但其他人可能没有意识到这一点。
【解决方案4】:

还要确保 ID 和 Name 属性是Public,否则会出现错误:
Cannot bind to the new display member.

【讨论】:

  • 谢谢!你刚刚让我免于额外花费数小时来解决这个问题。
  • 谢谢。就我而言,我有一个工作系统,并将我的一些对象更改为内部而不是公共的。这打破了绑定,将它们改回公共修复它。再次感谢。
  • 我们要绑定的属性也必须是可浏览的,所以不要给你要绑定的属性添加 [Browsable(false)] 属性(这种方式)。
【解决方案5】:

我在绑定时遇到了同样的问题。我颠倒了顺序,一切都开始工作了。 原始代码将如下所示

  ((ucComboBox)ctrl).combobox.ValueMember = "radiology_id";
  ((ucComboBox)ctrl).combobox.DisplayMember = "radiology_name";
  ((ucComboBox)ctrl).combobox.DataSource = info;

【讨论】:

  • 为我工作,但为什么呢?当值后面的数据是字符串时,它正在工作。当重构为 string[] - 停止工作 =|
【解决方案6】:

我遇到了同样的问题,并找到了一个可能不适用于您的问题但可能对其他人有帮助的解决方案:

标有[Browsable(false)]-Attribute 的属性在尝试绑定时也会导致此异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多