访问Datatable单元格值时的模糊性

时间:2018-06-15 01:53:50

标签: c# datatable

我一直在尝试使用下面的代码访问DataTable First列的第一个单元格值。但它返回NULL或BLANK值。

label13.Content = newDt.Rows[0][0].ToString();  //1st CODE

然后我尝试了以下代码,它解决了我的问题。不知道我的第一个代码中出现了什么错误。

label13.Content = newDt.Rows[0]["BATCH NUM"].ToString();  //2nd COde which solved Problem

知道第一个代码语句中出了什么问题。

以下是newDt的数据源

var newDt = dt.AsEnumerable()
              .GroupBy(r => r.Field<string>("BATCH NUM"))
              .Select(g =>
              {
                   var row = dt.NewRow();
                   row["BATCH NUM"] = g.Key;
          row["QTY"] = g.Sum(r => Convert.ToInt32(r.Field<string>("QTY"))); 

                   return row;
                 }).CopyToDataTable();

1 个答案:

答案 0 :(得分:2)

这是因为BATCH NUM不在索引0处。请看下面的示例。如果您确实需要使用索引来选择列,那么您必须将其作为下面的示例代码。

我认为索引不是0

    var index = dt.Columns["BATCH NUM"].Ordinal;
    var batchNum = dt.Rows[0][index]?.ToString();

下面的代码是模拟问题

    var dt = new DataTable();
    dt.Columns.Add("ID", typeof(string));
    dt.Columns.Add("BATCH NUM", typeof(string));
    dt.Columns.Add("QTY", typeof(int));

    var row = dt.NewRow();
    row["BATCH NUM"] = 1;
    row["QTY"] = 10;

    dt.Rows.Add(row);

    var val1 = dt.Rows[0][0]?.ToString();              //EMPTY
    var val2 = dt.Rows[0][1]?.ToString();              //1
    var val3 = dt.Rows[0][2]?.ToString();              //10

    var val4 = dt.Rows[0]["ID"]?.ToString();           //EMPTY
    var val5 = dt.Rows[0]["BATCH NUM"]?.ToString();    //1
    var val6 = dt.Rows[0]["QTY"]?.ToString();          //10