
- •Огляд сучасних Інтернет - технологій. Технологія asp.Net
- •Серверні елементи керування Label, TextBox, Button, Image, Table
- •Робота з xml
- •Файли перетворення документа
- •Файли визначення схеми документа
- •Клас XmlReader
- •Клас xPathDocument
- •Елемент управління xml
- •Створення простої сторінки, що використовує інформацію з бази даних
- •Елементи керування для відображення даних (repeater, datalist і datagrid)
- •Шаблони дизайну сторінок asp.Net
- •Зміст за замовчуванням
- •Програмне призначення головної сторінки
- •Вкладені майстер-сторінки
- •Послідовність подій
- •Створення структури переходів Web вузла
- •Елемент керування SiteMapPath
- •Програмне керування TreeView
- •Елемент керування Menu
Програмне керування 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 руб.", який не можна перетворити в число.