C# System.Data.DataRowView显示在winforms组合框中,而不是实际数据
加载组合框后,它将显示System.Data.DataRowView而不是数据。我使用的是存储过程返回的正确列名(TimeframeDesc和TimeframeCode) 调试时,我收到消息“无法绑定到新的显示成员”C# System.Data.DataRowView显示在winforms组合框中,而不是实际数据,c#,.net,winforms,combobox,C#,.net,Winforms,Combobox,加载组合框后,它将显示System.Data.DataRowView而不是数据。我使用的是存储过程返回的正确列名(TimeframeDesc和TimeframeCode) 调试时,我收到消息“无法绑定到新的显示成员” private bool loadTimeframeList(out string msg) { msg = ""; string spName = "schemaExec.SelTimeframeCode";
private bool loadTimeframeList(out string msg)
{
msg = "";
string spName = "schemaExec.SelTimeframeCode";
bool result = true;
SqlCommand cmd = new SqlCommand(spName);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = _sqlConn;
try
{
SqlDataAdapter rdr = new SqlDataAdapter(cmd);
cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
rdr.Fill(dt);
cbTimeframe.DisplayMember = "TimeframeDesc";
cbTimeframe.ValueMember = "TimeframeCode";
cbTimeframe.DataSource = dt;
}
catch (Exception ex)
{
result = false;
msg = "Could not load Timeframe Codes" + Environment.NewLine + ex.Message;
}
return result;
}
不确定这是否导致您的问题,但您不必使用
cmd.ExecuteNonQuery()代码>在填写表格之前。只是:
DataTable dt = new DataTable();
using(SqlCommand cmd = new SqlCommand("schemaExec.SelTimeframeCode", _sqlConn))
{
cmd.CommandType = CommandType.StoredProcedure;
using(var da = new SqlDataAdapter(cmd))
da.Fill(dt);
}
cbTimeframe.DisplayMember = "TimeframeDesc";
cbTimeframe.ValueMember = "TimeframeCode";
cbTimeframe.DataSource = dt;
在VisualStudio中的断点处,使用放大镜打开datatable的调试查看器。或者表中的foreachDataColumn
将列名附加到StringBuilder
这不是您的情况,但如果数据源设置在DisplayMember
,ValueMember
属性之前,则有时在恢复顺序时会发生这种情况。或者没有从以前的数据源中清除
cbTimeframe.DataSource = dt;
cbTimeframe.DisplayMember = "TimeframeDesc";
cbTimeframe.ValueMember = "TimeframeCode";
或
在rdr.Fill(dt)
之后设置断点,并仔细检查列名。请确保没有前导或尾随空格。您能告诉我如何准确地检查列名吗?我不知道我在找什么。在Visual Studio中,单击断点,使用放大镜打开datatable的调试查看器。或者表中的foreachDataColumn
将列名附加到StringBuilder
@loasting中,请将其作为答案发布,以便我可以标记它。我按照你的建议使用了放大镜——显然在存储过程中有调试“SELECT@whatever”语句,这些结果将返回到DataTable,而不是实际数据。好东西,回答贴出来了。
cbTimeframe.DataSource = ds1;
cbTimeframe.DisplayMember = "fn1";
cbTimeframe.ValueMember = "fn1";
cbTimeframe.DataSource = ds2; -> here you will get the problem (in the Event of index changed) if u didn't clean the DataSource used .
cbTimeframe.DisplayMember = "fn2";
cbTimeframe.ValueMember = "fn2";