Member 12926744 Ответов: 1

Изменение цвета узла в treeview


Всем Привет,
У меня есть treeview с узлами.Я осуществляю поиск по узлам treeview .Как только соответствующий узел будет найден ,цвет узла должен быть изменен .он работает нормально ,но проблема в том, что при поиске нового узла цвет ранее искомого узла также изменяется . Любая помощь будет очень признательна .Заранее спасибо.

Что я уже пробовал:

protected void btn_search_Click(object sender, EventArgs e)
       {
           try
           {
               FindNodesByString();

           }

           catch { }
       }

       private void FindNodesByString()
       {
           foreach (TreeNode currentNode in tv_AccountView.Nodes)
           {
               FindNodeByString(currentNode);
           }
       }

       private void FindNodeByString(TreeNode parentNode)
       {
           FindMatch(parentNode);
           foreach (TreeNode currentNode in parentNode.ChildNodes)
           {
               //currentNode.Text = currentNode.Text;
               FindMatch(currentNode);
               FindNodeByString(currentNode);
           }
       }
      private void FindMatch(TreeNode currentNode)
       {
           if (currentNode.Text.ToUpper().Contains(txt_searchbyname.Text.ToUpper()))
           {
               currentNode.Expand();
               currentNode.Text = "<div style='background-color:#ffffcc;color:#ff9900;'>" + currentNode.Text + "</div>";

   /// currentNode.ShowCheckBox = true;
               //return;
           }
           else
           {
               currentNode.Text = currentNode.Text;
               // currentNode.Collapse();
             //  currentNode.ShowCheckBox = false;
           }
       }

j snooze

Вы уверены, что предыдущий узел не просто сохраняет свое изменение цвета? Вам придется отслеживать предыдущий узел и менять цвет обратно при новом поиске...или есть пост обратно при каждом поиске?

1 Ответов

Рейтинг:
0

Vincent Maverick Durano

Это потому, что вы устанавливаете цвет с помощью div элемент. Как только он будет визуализирован в клиенте/браузере, он останется там. Ваш else блок вашего кода все равно будет содержать Text с <div> элемент к нему. Чтобы решить эту проблему, вам нужно будет реализовать небольшой синтаксический анализ текста.

Вот краткая демонстрация:

Aspx-файл:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TreeView ID="TreeView1" runat="server">
            <Nodes>
                <asp:TreeNode Text="Vincent">
                    <asp:TreeNode Text="Vynn" />
                    <asp:TreeNode Text="Vianne" />
                </asp:TreeNode>
                <asp:TreeNode Text="Maverick" />
            </Nodes>
        </asp:TreeView>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </form>
</body>
</html>


С ФОНОВЫМ КОДОМ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;

namespace WebFormDemo
{
    public partial class TreeView : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e) {

        }

        protected void Button1_Click(object sender, EventArgs e) {

            bool found = false;
            foreach (TreeNode node in TreeView1.Nodes) {
                found = IsNodeMatch(node, TextBox1.Text);

                if (!found) {
                    foreach (TreeNode childNode in node.ChildNodes) {
                        found = IsNodeMatch(childNode, TextBox1.Text);
                    }
                }
            }

            if (!found)
                Response.Write("Search did not match anything.");

        }

        private bool IsNodeMatch(TreeNode node, string searchText) {
            if (node.Text.ToLower().Equals(searchText.ToLower())) {
                node.Text = string.Format("<div style='color:#ff9900' >{0}</div>", node.Text);
                return true;
            }
            else {
                node.Text = ParseText(node.Text);
            }

            return false;
        }

        private string ParseText(string text) {
            string pattern = "<div(.*?)>(.*?)</div>";
            var regex = new Regex(pattern);

            var match = regex.Match(text);
            if (match.Length > 0)
                return match.Groups[2].Value;

            return text;
        }

    }
}


Ключ есть тот самый ParseText() это используется в рамках else блок для обрезки вниз div элемент.