背景
我有一个DataGridView
表,用TreeView
填充TreeNodes
。 TreeNode.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.Tag
与e.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();
}
}
}
结论
不要过于复杂化。