如何按列名获取列索引?

Posted

技术标签:

【中文标题】如何按列名获取列索引?【英文标题】:how to get column Index by column name? 【发布时间】:2015-10-02 23:00:48 【问题描述】:

我有一个包含几列的数据网格-

网格的标题是超链接,我在运行时设置它的值如下-

string strQ1 = "<a href='somePage.aspx?ID=1'>gfgytyty<a>";
dtGrid.Columns[0].Header = strq1;

string strQ2 = "<a href='somePage.aspx?ID=2'>yhtryrtuyu<a>";
dtGrid.Columns[1].Header = strq2;

and so on...

它工作正常。 现在假设我想通过名称获取 datatgrid 特定列的索引,但我无法获取它。 我试过了

int  colIndex = dtGrid.Columns.IndexOf(dtGrid.Columns[strQ2]);

这应该返回 1 作为 columnIndex 但它返回 -1,

另外,dtGrid.Columns[strQ2] 给了我空值。

我在这里做错了什么?

【问题讨论】:

wpf datagrid 还是 winforms datagridview? 这是 - dtGrid.Columns[strQ2] 导致有效的 DataGridColumn 对象,请验证,这可能是一个问题。在您的情况下,我可以看到您将 strq2 分配为标头,但在 IndexOf 调用中使用 strQ2 @MrinalKamboj 是的,你是对的! dtGrid.Columns[strQ2] 给出空值。你能告诉解决方法吗? 你确定是winforms datagrid?那没有 Columns 属性。但是 DataGridViewColumn 没有 Header 而是 HeaderText 属性。也许您的意思是 wpf DataGrid 哪些列具有 Header 属性。请不要混在一起。 在您的原始解决方案中,您能否尝试将 dtGrid.Columns[strQ2] 类型转换为 DataGridColumn 并检查,因为您使用的将给出一个对象类型,该类型在 Equals 方法中进行引用比较跨度> 【参考方案1】:

您可以先使用 LINQ FirstOrDefault 获取对象,然后才使用 .IndexOf(object) :

var targetColumn = dtGrid.Columns.FirstOrDefault(c => c.Header == strQ2);
var index = dtGrid.Columns.IndexOf(targetColumn);

【讨论】:

如果我想检查c.Header是否包含一个值?【参考方案2】:

这是使用List.FindIndex的另一种方法:

int index = dtGrid.Columns.ToList().FindIndex(c => c.Header  == strQ2);

如果它不是 WPF DataGrid(这似乎是由于 Header 属性)而是一个未实现泛型集合类型的 winforms DataGridView,则需要先转换它才能使用LINQ 方法:

var columnList = dtGrid.Columns.Cast<DataGridViewColumn>().ToList();
int index = columnList.FindIndex(c => c.HeaderText  == strQ2);

【讨论】:

这将是一个 O(n) 解决方案,而不是 Linq 查询会更好 @MrinalKamboj:接受的方法需要枚举列集合两次。但是,由于没有一千列这不是问题。

以上是关于如何按列名获取列索引?的主要内容,如果未能解决你的问题,请参考以下文章

datagridview 列索引

在Javascript中从Kendo网格中的列名获取列索引

合并时如何使用列索引?

如何按列索引重命名列?

如何使用 jQuery 获取表列索引?

基于列索引的 Spark Dataframe 选择