Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
web2.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
157.49 Кб
Скачать

Програмне керування TreeView

У TreeView є безліч подій. Подія SelectedNodeChanged запускається, коли користувач вибирає вузол:

protected void TreeLibrary_SelectedNodeChanged (object sender,

EventArgs e)

    (

        Label1.Text = "Ви вибрали категорію" +

TreeLibrary.SelectedNode.Text;

    )

Можна програмно розкривати і закривати вузли:

TreeView1.ExpandAll ();

TreeView1.CollapseAll ();

Подія TreeNodePopulate дозволяє динамічно заповнювати вузли, при цьому можна економити пам'ять, якщо заповнювати вузли тільки на вимогу після розкриття батьківського вузла. Подія TreeNodePopulate викликається, якщо дію (наприклад, розкриття) проведено з вузлом, у якого SelectAction налаштований на цю дію.

У наступному прикладі заповнимо значення елемента керування TreeView з бази даних Northwind. Батьківські вузли - категорії продуктів, які заповнюються даними про продукти тоді, коли вузол необхідно розкрити:

<asp: TreeView ID = "TreeViewCatProd" runat = "server"

ImageSet = "BulletedList3"

      OnTreeNodePopulate = "TreeViewCatProd_TreeNodePopulate"

ForeColor = "DarkOliveGreen">

      </ asp: TreeView>

public partial class Products: System.Web.UI.Page

(

  string connectionString = @ "Data Source =. \ SQLEXPRESS; Initial

Catalog = Northwind; Integrated Security = True ";

  protected void Page_Load (object sender, EventArgs e)

  (

    if (! Page.IsPostBack)

    (

      BindData ();

    )

  )

Допоміжна функція встановлює з'єднання з базою даних і повертає SqlDataReader - Найшвидший спосіб читання даних:

protected SqlDataReader CreateSqlDataReader (string SelectQuery,

string ConnectionString)

  (

    SqlConnection Connection = new

SqlConnection (ConnectionString);

      SqlCommand Command = new SqlCommand (SelectQuery, Connection);

    try

    (

      Command.CommandType = CommandType.Text;

      Command.Connection.Open ();

      SqlDataReader reader =

Command.ExecuteReader (CommandBehavior.CloseConnection);

      return reader;

    )

    catch

    (

      Connection.Close ();

      return null;

    )

  )

При роботі з базами даних важливо перехоплювати виключення:

protected void BindData ()

  (

    TreeNode parentNode = null;

    SqlDataReader reader = CreateSqlDataReader ( "Select

CategoryID, CategoryName from Categories ", connectionString);

    if (reader! = null)

    (

      while (reader.Read ())

      (

        parentNode = new

TreeNode (reader [ "CategoryName"]. ToString (),

reader [ "CategoryID"]. ToString ());

        parentNode.Collapse ();

        parentNode.PopulateOnDemand = true;

        parentNode.SelectAction = TreeNodeSelectAction.Expand;

        TreeViewCatProd.Nodes.Add (parentNode);

      )

      reader.Close ();

    )

 )

Конструктор TreeNode може викликатися без параметрів, але він перевантажений. Варіант, який тут використовується, дозволяє задати текст вузла і значення Value (заповнюється значенням CategoryID), Яке необхідно, щоб знайти в базі продукти цієї категорії.

При розкритті вузла з категорією викликатиметься обробник:

protected void TreeViewCatProd_TreeNodePopulate (object sender,

TreeNodeEventArgs e)

  (

    TreeNode node = e.Node;

    if (node.PopulateOnDemand)

    (

      string command = string.Format ( "Select ProductID,

ProductName from Products where CategoryID = (0) ", node.Value);

      SqlDataReader reader = CreateSqlDataReader (command,

connectionString);

      node.ChildNodes.Clear ();

      if (reader! = null)

      (

        while (reader.Read ())

        (

          TreeNode childNode = new

TreeNode (reader [ "ProductName"]. ToString ());

          childNode.SelectAction = TreeNodeSelectAction.None;

          node.ChildNodes.Add (childNode);

        )

        node.Expand ();

        reader.Close ();

      )

    )

  )

TreeView дозволяє не тільки показувати інформацію, але ставити прапорці поруч із вузлами. Це корисно, якщо в ньому міститься інформація про товари і користувач може вибрати деякі з них. Властивість ShowCheckBoxes допускає 5 значень: None, Root, Parent, Leaf, All:

ShowCheckBoxes = "Leaf"

При цьому поряд з вузлами-листям з'являються прапорці. Значення прапорців можна прочитати програмно:

<asp: XmlDataSource ID = "XmlDataSource3" runat = "server"

DataFile = "~ / menu.xml"> </ asp: XmlDataSource>

<asp: TreeView ID = "TreeMenu" runat = "server"

DataSourceID = "XmlDataSource3" BackColor = "# FFFBD6"

   Font-Names = "Verdana" Font-Size = "0.8em" ForeColor = "# 990000"

Height = "78px"

   Width = "415px" ShowCheckBoxes = "Parent"

OnTreeNodeCheckChanged = "TreeMenu_TreeNodeCheckChanged"

NodeWrap = "True" PopulateNodesFromClient = "False">

   <DataBindings>

      <asp: TreeNodeBinding DataMember = "name"

ValueField = "# InnerText" />

      <asp: TreeNodeBinding DataMember = "price" FormatString = "(0)

руб. "TextField =" # InnerText "ValueField =" # InnerText "/>

      <asp: TreeNodeBinding DataMember = "description"

TextField = "# InnerText" />

      <asp: TreeNodeBinding DataMember = "calories"

FormatString = "(0) калорій" TextField = "# InnerText" />

      <asp:TreeNodeBinding DataMember="food" TextField="name" />

      <asp: TreeNodeBinding DataMember = "pizza_menu" Text = "Меню

Піци "Value =" Меню Піци "/>

   </ DataBindings>

</ asp: TreeView>

<asp:Label ID="Label1" runat="server"> </ asp: Label>

Прапорці стоять біля батьківських вузлів, тому що саме там знаходяться назви страв. У обробнику можна динамічно показувати суму поточного замовлення:

protected void TreeMenu_TreeNodeCheckChanged (object sender,

TreeNodeEventArgs e)

    (

        decimal sumPrices = 0.0M;

        if (TreeMenu.CheckedNodes.Count> 0)

        (

            Label1.Text = "";

            foreach (TreeNode node in TreeMenu.CheckedNodes)

            (

              sumPrices + = decimal.Parse (node.ChildNodes [0]. Value);

            )

            Label1.Text = sumPrices.ToString () + "<br>";

        )

    )

Ціна записана в першому дочірньому поле з індексом 0. При цьому звертатися до властивості Text було б неправильно, тому що там знаходиться відформотований, наприклад, "306 руб.", який не можна перетворити в число.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]