我有两种方法直接处理我的TreeView(tvTreeview - orignal名称,是吗?):
private void tvTreeView_MouseClick(object sender, MouseEventargs e)
{
selectedNode = tvtreeView.HitTest(e.Location).Node;
/* some logic */
}
和
private void cbValue_Changed(object sender, EvenArgs e)
{
/* some logic related to changing the value that the node refers to.
* The nodes in the TreeView are each attached to a different bool,
* find that bool and check the value in memory matches that of the
* dropdown combobox */
/* clear the tree */
tvTreeView.BeginUpdate();
tvTreeView.Nodes.Clear();
//re-populate and re-draw the TreeView, then call the EndUpdate method
tvtreeView.EndUpdate();
tvTreeView.SelectedNode = selectedNode;
tvTreeView.SelectedNode.Expand();
}
基本上我正在做的是在下拉组合框的值发生变化时重新绘制TreeView。变量selectedNode定义在类的顶部:
public static TreeNode selectedNode;
我在tvTreeView.SelectedNode上抛出了NullReferenceException,Expand();仅当所选节点不是子节点时(即,当它是父节点或根节点时)。例如,如果我的TreeView看起来像这样:
Root <- no NullReferenceException thrown
-Parent <- no NullReferenceException thrown
-Child <- NullReferenceException thrown
-Child <- NullReferenceException thrown
-Parent <- no NullReferenceException thrown
-Child <- NullReferenceException thrown
NullReferenceException在任何子节点上抛出,但不在父节点或根节点上抛出。
当我放置一个断点(或抛出异常时)Visual Studio告诉我selectedNode不是null但是tvTreeView.SelectedNode是;这很奇怪,特别是因为这条线:
tvTreeView.Selectednode = selectedNode();
//tvTreeView.selectedNode is Null
//selectedNode is not null
当我重新绘制TreeView时,它包含与第一次绘制时相同的数据(它从内存中加载回来),并以相同的顺序添加节点。
我只是以错误的方式接近这个?当我选择子节点而不是父/根节点时,为什么tvtreeView.SelectedNode只为null?
我知道当你清除TreeView时,没有任何节点存在,所以我猜我的问题与此有关,但为什么只有在用户点击子节点时抛出异常?
答案 0 :(得分:2)
tvTreeView.Selectednode保持为null,因为您清除了树。 即使我试图选择树的一个元素,我也遇到了类似的问题。
不建议但解决问题 - 您可以创建一个新树,而不是清除树。
trv = new System.Windows.Forms.TreeView();
/*build the tree*/
trv.SelectedNode = elementOfTheTree;
第二个选项是使用beforeSelect事件处理程序并强制执行选择操作。 selectedNode在这些事件处理程序中反应良好。 也许是这样的:
bool isBeforeSelectInProgress = false;
private void beforeSelectFromTrv(object sender, TreeViewCancelEventArgs e)
{
if (isBeforeSelectInProgress)
{
e.Cancel = true;
return;
}
isBeforeSelectInProgress = true;
try
{
//save the changes and return the node that need to be focus
TreeNode nodeToSelect = saveChanges((TreeNode)e.Node);
//cancel any other selection event
e.Cancel = true;
nodeToSelect.EnsureVisible();
//release the event handler
isBeforeSelectInProgress = false;
//and than select the node you wish will be selected
(sender as System.Windows.Forms.TreeView).SelectedNode = toSelect;
}
finally
{
isBeforeSelectInProgress = false;
}
}