我将组合框绑定到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;
}
}
答案 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更改为我喜欢的任何内容。整洁的解决方案:)