【问题标题】:C# combobox set custom DiplayMemberC# 组合框设置自定义 DiplayMember
【发布时间】:2018-02-15 14:00:44
【问题描述】:

我将组合框绑定到 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。。 p>

实现这一点的正确方法是什么?

编辑:

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

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

【问题讨论】:

  • 请粘贴您的完整代码。包括您在哪里进行数据绑定
  • DisplayMember 应该是所选对象的属性。我什至不确定它是否适用于 DataRow。我建议用自定义对象填充你的 ComboBox。
  • @NicoRiff,查看我编辑的问题,我绑定了这样的组合框。绑定进入 BindData(dt, Combobox1, "MyDisplay", "ID");
  • @Lucy82 看起来它让你付出了很多努力来进行数据绑定......你是在使用 UI 处理单独的线程还是在动态地创建组合框??
  • @NicoRiff,有很多相同形式的组合框,所以我这样做是为了同时(并且快速)填充它们,而不是例如在组合框的每个 Enter 事件中放置代码

标签: c# winforms combobox


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2010-11-25
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多