1. Начните новый проект Smart Device в Visual Studio .NET и выберите в качестве целевой платформы Pocket PC.
2. Добавьте в форму Form в окне конструктора элементы управления TreeView и Button.
3. Дважды щелкните на кнопке Button в окне конструктора форм; в результате этого будет создан и подключен к кнопке приведенный ниже обработчик событий button1_Click.
4. Введите приведенный ниже код button1_Click, ответственный за заполнение данными элемента управления TreeView.
5. Введите оставшуюся часть приведенного ниже кода, включая константы, определения которых содержатся перед кодом обработчика прерываний button1_Click.
6. Вручную подключите обработчик событий для события BeforeExpand элемента управления TreeView, о чем говорилось в разделе выше.
7. Скомпилируйте пример и запустите его на выполнение.
Листинг 11.2. Динамическое заполнение данными элемента управления TreeView
//Фиктивный текст для размещения в заполнителях дочерних узлов
const string dummy_node = "_dummynode";
//Метка, которую мы будем использовать для обозначения узла
const string node_needToBePopulated = "_populateMe";
//Текст, который мы будем использовать для наших узлов высшего уровня
const string nodeText_Neighborhoods = "Neighborhoods";
const string nodeText_Prices = "Prices";
const string nodeText_HouseType = "HouseTypes";
//--------------------------------------------------------------------
//Обработчик события щелчка для кнопки
//
//Настраивает наш элемент управления TreeView для отображения процесса
//последовательного заполнения дерева
//--------------------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
TreeNode tnNewNode;
//Отключить обновление интерфейса до тех пор, пока дерево
//не будет заполнено
treeView1.BeginUpdate();
//Избавиться от устаревших данных
treeView1.Nodes.Clear();
//--------------------
//Узел "Neighborhoods"
//--------------------
//Добавить узел "Neighborhoods" верхнего уровня.
tnNewNode = treeView1.Nodes.Add("Neighborhoods");
//Установить для узла метку, указывающую на то, что узел
//будет заполняться динамически
tnNewNode.Tag = node_needToBePopulated;
//Этот фиктивный дочерний узел существует лишь для того, чтобы
//узел имел, по крайней мере, один дочерний узел и поэтому
//был расширяемым.
tnNewNode.Nodes.Add(dummy_node);
//------------
//Узел "Price"
//------------
tnNewNode = treeView1.Nodes.Add("Price");
//Установить для узла метку, указывающую на то, что узел
//будет заполняться динамически
tnNewNode.Tag = node_needToBePopulated;
//Этот фиктивный дочерний узел существует лишь для того, чтобы
//узел имел, по крайней мере, один дочерний узел и поэтому
//был расширяемым.
tnNewNode.Nodes.Add(dummy_node);
//----------------
//Узел "HouseType"
//----------------
tnNewNode = treeView1.Nodes.Add("HouseType");
//Установить для узла метку, указывающую на то, что узел
//будет заполняться динамически
tnNewNode.Tag = node_needToBePopulated;
//Этот фиктивный дочерний узел существует лишь для того, чтобы
//узел имел, по крайней мере, один дочерний узел и поэтому
//был расширяемым.
tnNewNode.Nodes.Add(dummy_node);
//Восстанавливаем обновление интерфейса
treeView1.EndUpdate();
}
//-------------------------------------------------------------------------
//Обработчик событий BeforeExpand для нашего элемента управления TreeView
//ПРИМЕЧАНИЕ: Этот обработчик событий необходимо будет
// вручную подключить к функции InitializeComponent()
// формы.
//
//Вызывается при запросе пользователем расширения узла, у которого имеется,
//по крайней мере, один дочерний узел. Этот вызов осуществляется до
//отображения дочерних узлов данного узла и дает нам возможность
//динамически заполнить данными элемент управления TreeView.
//-------------------------------------------------------------------------
private void TreeView1BeforeExpand (object sender, System.Windows.Forms.TreeViewCancelEventArgs e) {
//Получить узел, который будет расширяться
System.Windows.Forms.TreeNode tnExpanding;
tnExpanding = e.Node;
//Если узел не отмечен как "нуждающийся в заполнении данными",
//то он устраивает нас в том виде, "как он есть".
if (tnExpanding.Tag !=(object) node_needToBePopulated) {
return; //Разрешить беспрепятственное продолжение выполнение
}
//------------------------------------------------------------
//Требуется динамическое заполнение дерева данными.
Читать дальше