【问题标题】:How to highlight the first inserted node in a tree view?如何在树视图中突出显示第一个插入的节点?
【发布时间】:2012-12-28 21:10:48
【问题描述】:

我有一个包含两种形式的应用程序。第一种形式用于以编程方式创建TreeView 节点,第二种形式具有实际的TreeView。当应用程序加载时,我在TreeView 中创建了两个根节点。

我的问题是当我为任一根节点创建我的第一个子节点时,它没有突出显示。我给了 Form 和 TreeView 焦点,还禁用了 TreeViewHideSelection 属性。

当我向任一根节点添加另一个子节点时,插入的节点就会突出显示。我希望每个插入的节点在插入后突出显示,但这仅在插入第一个节点后才有效。

示例代码:

m_ObjectAnimationForm.tr_vw_ANIMATION_OBJECT_LIST.SelectedNode = m_ObjectAnimationForm.tr_vw_ANIMATION_OBJECT_LIST.Nodes["OBJECTS_ROOT"].Nodes.Add(NewObject.ID, NewObject.ID);

我使用“KEY”对象的 ID 和节点的字符串创建一个新的树节点,然后该函数返回新创建的树节点,使其成为树中的选定节点。

在我调用该代码之后:

m_ObjectAnimationForm.tr_vw_ANIMATION_OBJECT_LIST.ExpandAll();
m_ObjectAnimationForm.tr_vw_ANIMATION_OBJECT_LIST.Focus();

【问题讨论】:

  • 此代码运行时该表单是否可见?为什么它没有焦点?支持 Select() 而不是 Focus()。
  • 我发现使用 Select() 可以解决问题。我必须调用表单的 Select(),然后调用树视图的 Select() 才能使其正常工作。谢谢。

标签: c# wpf treeview


【解决方案1】:

我有一个稍微不同的设置,我通过在 datagridview 中选择一个项目来控制 TreeView 中突出显示的项目。这不是最优雅的方法,但它确实有效。

总结:

1.) 从 Source TreeView、其他控件或其他地方获取索引 2.) 展开 Target TreeView 中的所有节点 3.) 遍历目标中的树节点,直到达到索引 4.) 设置 TreeView.SelectedNode = "找到的节点" 5.) 在 TreeView 上设置焦点

    private void selectTreeViewItem(int dataGridViewRowIndex)
    {
        expandAllTreeViewNodes();
        setTreeViewItem(dataGridViewRowIndex);
    }

    private void setTreeViewItem(int dataGridViewRowIndex)
    {
        int iterator = 0;
        TreeNode tempNode = testStepTreeView.Nodes[iterator];
        //don't need to actually return the integer...
        iterator = findNode(tempNode, dataGridViewRowIndex, iterator);
        testStepTreeView.Focus();
        nodeFound = false;
    }

    private void expandAllTreeViewNodes()
    {
        if (testStepTreeView.Nodes.Count != 0)
        {
            foreach (TreeNode x in testStepTreeView.Nodes)
            {
                expandNode(x);
            }
        }
    }

    private void expandNode(TreeNode x)
    {
        if (x.IsExpanded == false)
        {
            x.Expand();
        }
        if (x.Nodes.Count > 0)
        {
            foreach (TreeNode y in x.Nodes)
            {
                expandNode(y);
            }
        }
    }

    private int findNode(TreeNode tempNode, int dataGridViewRowIndex, int iterator)
    {

        if (iterator > dataGridViewRowIndex)
        {
            return iterator;
        }
        if (iterator == dataGridViewRowIndex)
        {
            testStepTreeView.SelectedNode = tempNode;
            nodeFound = true;
            return iterator;
        }

        if (tempNode.Nodes.Count != 0)
        {
            iterator++;
            if (iterator > dataGridViewRowIndex)
            {
                return iterator;
            }
            if (nodeFound == false)
            {
                iterator = findNode(tempNode.Nodes[0], dataGridViewRowIndex, iterator);
            }
        }

        if (tempNode.NextNode != null)
        {
            iterator++;
            if (iterator > dataGridViewRowIndex)
            {
                return iterator;
            }
            if (nodeFound == false)
            {
                iterator = findNode(tempNode.NextNode, dataGridViewRowIndex, iterator);
            }

        }
        return iterator;
    }

【讨论】:

    【解决方案2】:

    尝试使用 Node.Select(),它会选择节点并突出显示它。

    焦点在这里不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多