C#combobox设置自定义DiplayMember

时间:2018-02-15 14:00:45

标签: c# winforms combobox

我将组合框绑定到DataTable(表格列是" NAME"," SURNAME"" ID")。目前,我已将ValueMember设置为" ID",并将DisplayMember设置为" SURNAME"。我希望仅更改DisplayMember - 和DisplayMember。通过阅读各种文档(包括这个论坛)可以通过公开自定义属性并将组合框绑定到它来实现,但是我对它有困难。

找到最近的解决方案here,您可以在其中设置组合框格式,但这也会更改ValueMember。虽然在接受的答案中提到你可以通过暴露属性只对DisplayMember做同样的事情......

所以我尝试了这个:

  private string _employee;
  public string MyDisplay
        {
            get
            {
                DataRowView r = (DataRowView)this.SelectedItem;
                DataRow s = r.Row;
                return _employee= s["SURNAME"].ToString() + " " + s["NAME"].ToString();
            }
            set
            {
                this._employee = value;
            }
        }

但是,当我将它绑定到 MyDisplay 时,我没有显示我的自定义DisplayMember,当我滚动组合框时它的文本只有 System.Data.DataRowView < /强>

完成此任务的正确方法是什么?

编辑:

我绑定组合框的完整代码:

 private void FillCombobox()
        {
            var dt = new DataTable();
            try
            {
                using (var conn = new OracleConnection(conn_string))
                {
                       using (OracleCommand cmd = new OracleCommand("MYSCHEMA.EMPLOYEES"))
                    {
                        cmd.Connection = conn;
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add(new OracleParameter("CHOOSE_SELECT_IN", OracleDbType.Decimal, 6, ParameterDirection.Input));
                        cmd.Parameters.Add(new OracleParameter("RESULT_OUT", OracleDbType.RefCursor)).Direction = ParameterDirection.Output;

                        using (OracleDataAdapter da = new OracleDataAdapter())
                        {
                            da.SelectCommand = cmd;
                            da.Fill(dt);
                        }

                    //bind combobox
                    BindData(dt, Combobox1, "MyDisplay", "ID");
              }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }

        private void BindData(DataTable dt, ComboBox ctl, string displayMember, string valueMember)
        {
            if (ctl.InvokeRequired)
            {
                ctl.Invoke(new Action<DataTable, ComboBox, string, string>(BindData),
                               dt,
                               ctl,
                               displayMember,
                               valueMember);
            }
            else
            {
                ctl.DisplayMember = displayMember;
                ctl.ValueMember = valueMember;
                ctl.DataSource = dt;
                ctl.Text = "";
                ctl.SelectedIndex = -1;
            }
        }

1 个答案:

答案 0 :(得分:0)

看起来有一个简单的,一行的方法,没有任何类型的属性需要。只需将计算列添加到绑定Combobox的地方的数据表中,然后将该列设置为DiplayMember。所以我对所有问题的解决方案如下:

   //Add calculated column to Datatable and set this column to DiplayMember
   dt.Columns.Add("MyDisplay", typeof(string),"SURNAME + " " + NAME");

所以,这很简单。我甚至在.config中包含了显示设置,因此我可以将组合框DisplayMember更改为我喜欢的任何内容。整洁的解决方案:)