C#从DataGridViewRow索引

时间:2017-01-18 10:11:30

标签: c# linq datagridview treeview

背景

我有一个DataGridView表,用TreeView填充TreeNodesTreeNode.Tag属性值由表RowIndex确定。当我在表格中选择Cell时,也应选择带有所选tablerowindex作为标记的TreeView节点,并将其扩展为父级。

但是如何获取节点标记值并将其与RowIndex进行比较?我使用this扩展方法从TreeNode获取所有TreeView个对象,如下所示

var select = from node in treeView.Descendants()
             where (node.Tag as string) == e.RowIndex.ToString()
             select node as TreeNode;

但是var select会返回一个空的WhereSelectListIterator?我哪里出错了?

更新1

TreeNode TreeNode.Tag IndexRow位于TreeNode.Level 3,Descendants()方法仅返回根级别节点和根级子节点,并且这就是我的WhereSelectListIterator为空的原因。

现在的问题是如何让Descendants()方法在TreeNodes 3包含TreeNode.Level

更新2

我没有使用Descendants()方法,而是使用this扩展方法获取TreeNodes中所有TreeView的列表,并且无论在什么级别都包含所有节点。< / p>

但现在我无法将node.Tage.RowIndex进行比较?

目前的方法:

private void headerGridView_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        List<TreeNode> oNodeList = treeView.GetAllNodes();

        var select = from node in oNodeList
                     where (node.Tag as string) == e.RowIndex.ToString()
                     select node as TreeNode;
        foreach (TreeNode node in select)
        {
            // This never happens because the select is empty
        }
    }

我测试了oNodeList,所以我知道(!)列表中有标签的节点。

StringBuilder sb = new StringBuilder();
foreach (TreeNode node in oNodeList)
{
    if (node.Tag != null) sb.AppendLine(node.Name);
}
MessageBox.Show(sb.ToString());

我找到了解决问题的方法。实际上没有必要使用Linq来选择节点并添加到WhereSelectListIterator。解决方案比这简单得多。

private void headerGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
    List<TreeNode> oNodeList = treeView.GetAllNodes();
    foreach (TreeNode node in oNodeList)
    {
        if (node.Tag == null) continue;
        if ((int)node.Tag == e.RowIndex)
        {
            treeView.SelectedNode = node;
            if (!treeView.SelectedNode.Parent.IsExpanded) treeView.SelectedNode.Parent.Expand();
        }
    }
}

结论

不要过于复杂化。

0 个答案:

没有答案