获取具有名称的 DataTable 列的索引
Posted
技术标签:
【中文标题】获取具有名称的 DataTable 列的索引【英文标题】:get index of DataTable column with name 【发布时间】:2012-07-05 14:49:14 【问题描述】:我有一些代码可以通过列名来设置 DataRow 中单元格的值,即
row["ColumnName"] = someValue;
我还想在上面找到的列的右侧立即设置该行的值。显然,如果我按索引而不是按列名获取单元格,这将很容易。那么有没有办法从列名中获取列索引,从而允许我这样做:
row[index + 1] = someOtherValue;
即我是否需要在最初创建表时创建某种列索引和列名字典,或者我可以稍后从列名中获取索引而不这样做?
【问题讨论】:
【参考方案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." 所以除非这有一些性能提升,否则请删除。这也没有回答如何获取索引的问题。以上是关于获取具有名称的 DataTable 列的索引的主要内容,如果未能解决你的问题,请参考以下文章
从具有大量列的 DataTable 添加值后清空 DataGridView