如何在C#中将节点重置为树视图中的unbold

时间:2014-03-13 10:08:23

标签: c# asp.net treeview

在选择特定内容时我想突出显示节点为粗体的树路径。

protected void Trv_SelectedNodeChanged(object sender, EventArgs e)
{
    HighlightPath(Trv.SelectedNode);
}

private void HighlightPath(TreeNode node)
{
    node.SelectAction = TreeNodeSelectAction.None;
    node.Text = "<div style=font-weight:bold>" + node.Text + "</div>";
    if (node.Parent != null)
    HighlightPath(node.Parent);
}

但是下次如果我正在调整另一个节点,它应该将前一个节点标记为unbold,将新路径标记为粗体。请帮忙。

2 个答案:

答案 0 :(得分:0)

您可以通过在List<TreeNode>中删除所有突出显示的节点来解决此问题,然后在突出显示新路径之前,您可以取消列表中的项目。

// New list of currently highlighted nodes
protected List<TreeNode> highlightedNodes = new List<TreeNode>();

protected void Trv_SelectedNodeChanged(object sender, EventArgs e)
{
    // Call the method to un-highligt first
    UnHighlightNodes();

    HighlightPath(Trv.SelectedNode);
}

private void UnHighlightNodes()
{
    foreach(var node in highlightedNodes)
    {
        // TODO: code to un-highlight nodes
    }
    // Clear List of highlighted nodes
    highlightedNodes.Clear();
}

private void HighlightPath(TreeNode node)
{
    node.SelectAction = TreeNodeSelectAction.None;
    node.Text = "<div style=font-weight:bold>" + node.Text + "</div>";
    if (node.Parent != null)
    HighlightPath(node.Parent);

    // Store the node in the list of highlighted nodes
    highlightedNodes.Add(node);
}

这可以进一步优化以防止不突出显示,然后再次突出显示。像这样:

// New list of currently highlighted nodes
protected List<TreeNode> HighlightedNodes = new List<TreeNode>();

protected void Trv_SelectedNodeChanged(object sender, EventArgs e)
{
    var nodesToHighlight = FindPathToRoot(Trv.SelectedNode).ToList();

    // Un-highlight nodes (except those which should stay highlighted)
    UnHighlightNodes(HighlightedNodes.Except(nodesToHighlight));

    // Highlight nodes (except nodes already highlighted)
    HighlightNodes(nodesToHighlight.Except(HighlightedNodes));

    // Save the new list of highlighted nodes;
    HighlightedNodes = nodesToHighlight;
}

private static IEnumerable<TreeNode> FindPathToRoot(TreeNode node)
{
    do
    {
        yield return node;
        node = node.Parent;
    } while (node != null);
}

private void UnHighlightNodes(IEnumerable<TreeNode> nodes)
{
    foreach (var node in nodes)
    {
        // TODO: code to un-highlight nodes
    }
}

private void HighlightNodes(IEnumerable<TreeNode> nodes)
{
    foreach (var node in nodes)
    {
        node.SelectAction = TreeNodeSelectAction.None;
        node.Text = "<div style=font-weight:bold>" + node.Text + "</div>";
    }
}

答案 1 :(得分:0)

我认为您需要在treeview asp.net页面中粗体选择节点及其父节点。 如果是这样,你就不需要让它变得复杂。请尝试将其置于page load事件中,如图所示。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (TreeNode ParentNodes in TreeView1.Nodes)
        {
            ParentNodes.Text = ParentNodes.Text.Replace("<b>", "").Replace("</b>", "");
            foreach (TreeNode ChildNodes in ParentNodes.ChildNodes)
            {
                ChildNodes.Text = ChildNodes.Text.Replace("<b>", "").Replace("</b>", "");
            }
        }
        TreeNode node = TreeView1.SelectedNode;
        node.Text = Server.HtmlDecode("<b>" + node.Text + "</b>");
        node.Parent.Text = Server.HtmlDecode("<b>" + node.Parent.Text + "</b>");
    }
}

这里TreeView1是我的树视图。您不需要在SelectedNodeChanged事件中执行任何操作。