C#TreeView SelectedNode是否为空?

时间:2012-02-09 10:13:37

标签: .net visual-studio-2008 treeview c#-3.0

我有两种方法直接处理我的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时,没有任何节点存在,所以我猜我的问题与此有关,但为什么只有在用户点击子节点时抛出异常?

1 个答案:

答案 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;
    }
}