使用列名获取DataTable列的索引

49

我有一些代码,通过列名设置DataRow中单元格的值,例如:

row["ColumnName"] = someValue;

我还想设置该行中紧挨在上述所找到的列右边的那一列的值。显然,如果我是通过索引而不是通过列名获取单元格,这将很容易实现。因此,是否有一种方法可以从列名获取列索引,从而使我能够执行以下操作:

row[index + 1] = someOtherValue;

也就是说,当表格最初创建时,我需要创建某种列索引和列名称的字典吗?还是在以后可以通过列名获取索引而无需这样做?

4个回答

89

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

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

警告:

这段代码返回ColumnName之后的下一列,即问题中要求的那一列。


2
你不需要 + 1,只需要 row[row.Table.Columns["ColumnName"].Ordinal] = someOtherValue; 就可以了。 - Piers Myers
5
@Piers:但是OP需要在另一列之后的下一列。 - Tim Schmelter
那你应该写成 ..获取下一列的索引。我因为那个 +1 引起错误而在我的代码中无意中使用了你的代码行。感谢 @PiersMyers 指出这个问题。 - C4d
@TimSchmelter,如何获取数组中的所有列索引? 例如:Table.Columns[0,1,2,3,4,5,6,7] - thevinaychoudhary

42

试试这个:

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

2
+1 虽然 Tim 比你更快回答了,但我会把他的回答标记为答案。 - Andy

9

您可以简单地使用DataColumnCollection.IndexOf

通过名称获取所需列的索引,然后将其与您的行一起使用:

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

3
我编写了一个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”吗?http://msdn.microsoft.com/en-us/library/system.data.objectnotfoundexception%28v=vs.110%29.aspx - Jonathan Kittell
如果您使用 row["YourColumnName"],DataRow 在您的示例中已经内置了它,它将返回该单元格的内容。如果列不存在,则会引发 System.ArguementException 错误,并显示消息 {"Column 'YourColumnName' does not belong to table Table."}。因此,除非这有一些性能上的好处,请将其删除。此外,这并没有回答如何获取索引的问题。 - DeadlyChambers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接