在WinForm程序中设置ComboBox的DisplayMember的规则是什么

时间:2019-01-15 08:29:48

标签: c# winforms combobox

我正在学习WinForm,在最近的实践中,我想实现这样的功能: 一个ComboBox,其中包含一些其他控件。 ComboBox的DisplayMember是每个控件的“名称”,ValueMember是其控件的“句柄”。 像这样。 Application Picture

但是,它不能很好地工作,当我调试时,我发现绑定数据源后,DisplayMember显示一个空字符串。 Debug

如果我将其设置为“ Handle”,则ValueMember设置也会显示错误。

使用这两个属性是否有任何规则?

代码如下。

cmbAllControls.DataSource = allControlsList;//DataSource, List<Control>.
cmbAllControls.DisplayMember = "Name";
cmbAllControls.ValueMember = "TabIndex";//TabIndex is OK, but Handle will throw error.

1 个答案:

答案 0 :(得分:0)

似乎与Handle上的Browseable(假属性)有关。当我尝试下面的代码时,如果删除属性,但会因ArgumentException“无法绑定到新的值成员”而崩溃,工作正常。

public Form1()
{
    InitializeComponent();

    comboBox1.DataSource = new List<MyObj>()
    {
        new MyObj(){Name = "Fish",MyInt = 3,MyIntPtr = new IntPtr(5),MyIntPtr2 = new IntPtr(7)}
    };

    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "MyIntPtr";
    comboBox1.ValueMember = "MyIntPtr2";
    comboBox1.SelectedIndexChanged += (s, e) => { MessageBox.Show("Selected:" + comboBox1.SelectedValue); };
}

private class MyObj
{
    public string Name { get; set; }
    public int MyInt { get; set; }
    public IntPtr MyIntPtr { get; set; }

    [System.ComponentModel.Browsable(false)] //This attribute causes the error
    public IntPtr MyIntPtr2 { get; set; }
}