【问题标题】:System.Data.DataRowView shows in winforms combobox instead of actual dataSystem.Data.DataRowView 在 winforms 组合框中显示而不是实际数据
【发布时间】:2015-03-27 14:57:48
【问题描述】:

加载组合框后,它会显示 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;
    }

【问题讨论】:

  • rdr.Fill(dt) 之后设置断点并仔细检查列名。确保没有前导或尾随空格。
  • 你能告诉我具体如何检查列名吗?我不知道我在找什么。谢谢
  • 在断点处,在 Visual Studio 中,使用放大镜打开数据表的调试查看器。或 foreach DataColumn in table 将列名附加到 StringBuilder
  • @Loathing 请作为答案发布,以便我标记它。我按照您的建议使用了放大镜 - 显然在存储过程中有调试“SELECT @whatever”语句,这些结果被返回到 DataTable 而不是实际数据。
  • 好东西,已发布答案。

标签: c# .net winforms combobox


【解决方案1】:

在断点处,在 Visual Studio 中,使用放大镜打开数据表的调试查看器。或 foreach DataColumn in table 将列名附加到 StringBuilder

【讨论】:

    【解决方案2】:

    不确定这是否会导致您的问题,但您不必在填写表格之前使用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;     
    

    【讨论】:

      【解决方案3】:

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

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

      或者

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多