Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Data.DataRowView显示在winforms组合框中,而不是实际数据_C#_.net_Winforms_Combobox - Fatal编程技术网

C# System.Data.DataRowView显示在winforms组合框中,而不是实际数据

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

加载组合框后,它将显示System.Data.DataRowView而不是数据。我使用的是存储过程返回的正确列名(TimeframeDesc和TimeframeCode)

调试时,我收到消息“无法绑定到新的显示成员”

        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的调试查看器。或者表中的foreach
DataColumn
将列名附加到
StringBuilder

这不是您的情况,但如果数据源设置在
DisplayMember
ValueMember
属性之前,则有时在恢复顺序时会发生这种情况。或者没有从以前的数据源中清除

cbTimeframe.DataSource = dt;
cbTimeframe.DisplayMember = "TimeframeDesc";
cbTimeframe.ValueMember = "TimeframeCode";


rdr.Fill(dt)
之后设置断点,并仔细检查列名。请确保没有前导或尾随空格。您能告诉我如何准确地检查列名吗?我不知道我在找什么。在Visual Studio中,单击断点,使用放大镜打开datatable的调试查看器。或者表中的foreach
DataColumn
将列名附加到
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";