【发布时间】: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 事件中放置代码