【问题标题】:get index of DataTable column with name获取具有名称的 DataTable 列的索引
【发布时间】:2012-07-05 14:49:14
【问题描述】:

我有一些代码可以通过列名来设置 DataRow 中单元格的值,即

row["ColumnName"] = someValue;

我还想在上面找到的列的右侧立即设置该行的值。显然,如果我按索引而不是按列名获取单元格,这将很容易。那么有没有办法从列名中获取列索引,从而允许我这样做:

row[index + 1] = someOtherValue;

即我是否需要在最初创建表时创建某种列索引和列名字典,或者我可以稍后从列名中获取索引而不这样做?

【问题讨论】:

    标签: c# asp.net datatable datarow


    【解决方案1】:

    您可以使用DataColumn.Ordinal 获取DataTable 中列的索引。因此,如果您需要提到的下一列,请使用 Column.Ordinal + 1:

    row[row.Table.Columns["ColumnName"].Ordinal + 1] = someOtherValue;
    

    【讨论】:

    • 您不需要+ 1,只需row[row.Table.Columns["ColumnName"].Ordinal] = someOtherValue; 即可。
    • @Piers:但 OP 需要在另一列之后的下一列。
    • 那么你应该写..to get the index of the NEXT column。我不小心在我的代码中使用了你的行,同时犯了那个 +1 的错误。感谢@PiersMyers 注意到它。
    • @TimSchmelter,如何获取数组中的所有列索引?例如:Table.Columns[0,1,2,3,4,5,6,7]
    【解决方案2】:

    试试这个:

    int index = row.Table.Columns["ColumnName"].Ordinal;
    

    【讨论】:

    • +1 虽然蒂姆打败了你,但我会将他标记为答案。
    【解决方案3】:

    您可以简单地使用DataColumnCollection.IndexOf

    这样您就可以按名称获取所需列的索引,然后将其与您的行一起使用:

    row[dt.Columns.IndexOf("ColumnName")] = columnValue;
    

    【讨论】:

      【解决方案4】:

      我写了一个 DataRow 的扩展方法,它通过列名获取对象。

      public static object Column(this DataRow source, string columnName)
      {
          var c = source.Table.Columns[columnName];
          if (c != null)
          {
              return source.ItemArray[c.Ordinal];
          }
      
          throw new ObjectNotFoundException(string.Format("The column '{0}' was not found in this table", columnName));
      }
      

      它的名字是这样的:

      DataTable data = LoadDataTable();
      foreach (DataRow row in data.Rows)
      {        
          var obj = row.Column("YourColumnName");
          Console.WriteLine(obj);
      }
      

      【讨论】:

      • 这个扩展是否应该抛出“ObjectNotFoundException”而不是“ItemNotFoundException”? msdn.microsoft.com/en-us/library/…
      • -1 DataRow 已经在您的示例中构建了它,如果您执行 row["YourColumnName"] 它将返回该单元格的内容。如果该列不存在,则会抛出 System.ArguementException 并且这是消息 {"Column 'YourColumnName' doesn't belongs to table Table."} 所以除非这有一些性能提升,否则请删除。这也没有回答如何获取索引的问题。
      猜你喜欢
      • 2023-04-09
      • 2014-05-21
      • 2017-10-09
      • 2021-12-16
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多