2012-02-23 510 views
3

我有一个组合框作为用户控件创建(它实际上由标签,组合框和文本框组成)。我试图绑定一个数据集的数据源组合框,但我一直ValueMember /显示器件上收到错误消息:组合框问题:无法绑定到新的值成员

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"; 

它吹起来,每当它击中值成员,我也得到上述的两个错误。我在用户控件中丢失了什么?对我来说,这应该是工作..(fyi - 信息数据源确实包含两列)

我试过了一堆不同的战术,没有成功。请帮忙!

谢谢

+1

什么是'info'?你是否确定无论存储在那里有公共radiology_id和radiology_name? – kevev22 2012-02-23 21:40:15

+0

我很积极。我在设置之前查看数据集。 – Encryption 2012-02-23 21:47:10

+0

'info'是一个DataSet还是一个DataTable?如果它是一个DataSet,你将不得不将DataSource设置为所需的DataTable:'DataSource = info.Tables [0];' – kevev22 2012-02-23 21:51:56

回答

0

从使用Datatset搬走中/值。创建了一个包含ID和名称值的类(“设施”)。将“信息”更改为列表类型。然后下面的代码工作得很好:

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"; 

没有绑定的问题。

+0

我在我的Id属性上有一个[Browsable(false)]属性的类,这似乎会导致ValueMember引发此错误。对于这个问题,这可能有点晚,但其他人可能没有意识到这一点。 – icepicker 2015-03-09 07:28:35

1

当然下面的代码片段会导致一个问题?

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

你需要命名这个东西,例如comboValue。 “值”表示传递给属性声明的隐式变量。

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

更改了名称,仍然得到相同的两个错误。 – Encryption 2012-02-23 21:46:43

+1

虽然命名“值”是一个不错的选择,但我认为它并不相关 – 2012-02-23 21:49:19

+0

可以显示数据源的代码,即包含radiology_id和radiology_name属性的信息对象吗? (如果它不这样做,那就是为什么它不工作...) – kaj 2012-02-23 21:56:08

0

我认为你有你的财产组合,以不同的东西修饰符公共
但是我会选择在usercontrol级别实现两个新的公共属性。
DisplayMemberValueMember只是为了避免丑陋的演员。
在设置/ get访问我会反映在内部组合

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

尝试过这一点,但我认为我是不会覆盖正确的名称。将再次工作。 – Encryption 2012-02-23 22:13:32

+0

仍然不喜欢那个代码。在运行这些属性时获取相同的错误消息...呃。 – Encryption 2012-02-23 22:50:33

+0

我可以问你在usercontrol的designer.cs中显示相关的代码吗?这里有什么不对劲。 – Steve 2012-02-23 23:00:04

8

同时确保ID和Name属性是公共否则你得到的错误:
Cannot bind to the new display member.

+2

谢谢!你只需要额外的几个小时就可以解决这个问题。 – Epaga 2013-06-14 06:56:30

+0

@Epaga很高兴帮助:) – 2013-06-14 09:48:50

+0

谢谢。在我的情况下,我有一个工作系统,并将我的一些对象改为内部而不是公开。这打破了约束,改变他们回到公共固定它。再次感谢。 – 2015-01-10 23:40:31

2

我有同样的问题,而结合。我扭转了秩序,一切开始工作。 原始代码看起来像这样

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

为我工作,但为什么?它正在工作,而数据背后的数据是String。当重构为字符串[] - 停止工作= | – 2016-06-30 08:30:35

0

我有同样的问题,并发现可能不适用于你的问题的解决方案,但可能对他人有所帮助:

标有[Browsable(false)]的属性 - 试图绑定到它时,属性也会导致此异常。