}
//-------------------------------------------------------------------------
//Обработчик событий 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; //Разрешить беспрепятственное продолжение выполнение
}
//------------------------------------------------------------
//Требуется динамическое заполнение дерева данными.
//Мы знаем, что узел должен быть заполнен данными; определить,
//что это за узел
//------------------------------------------------------------
if (tnExpanding.Text == nodeText Neighborhoods) {
PopulateTreeViewNeighborhoods(tnExpanding);
return; //добавление элементов закончено!
} else {
//Проверить другие возможности для узлов дерева, которые мы должны
//добавить.
System.Windows.Forms.MessageBox.Show("НЕ СДЕЛАНО: Добавьте код для динамического заполнения этого узла");
//Снять отметку с этого узла, чтобы мы не могли вновь выполнить
//этот код
tnExpanding.Tag = "";
}
}
//------------------------------------------------------------------
//Эта функция вызывается для динамического добавления дочерних узлов
//в узел "Neighborhood"
//------------------------------------------------------------------
void PopulateTreeViewNeighborhoods(TreeNode tnAddTo) {
TreeView tvControl;
tvControl = tnAddTo.TreeView;
tvControl.BeginUpdate();
//Очистить имеющийся фиктивный узел
tnAddTo.Nodes.Clear();
//Объявить четыре узла, которые мы хотим сделать дочерними узлами
//того узла, который был передан.
TreeNode[] newNeighborhoodNodes;
newNeighborhoodNodes = new TreeNode[4];
newNeighborhoodNodes[0] = new TreeNode("Capitol Hill");
newNeighborhoodNodes[1] = new TreeNode("Chelsea");
newNeighborhoodNodes[2] = new TreeNode("Downtown");
newNeighborhoodNodes[3] = new TreeNode("South Bay");
//Добавить дочерние узлы в элемент управления
TreeView tnAddTo.Nodes.AddRange(newNeighborhoodNodes);
tvControl.EndUpdate();
}
Приведенный код демонстрирует, что, проявив немного изобретательности и написав совсем небольшой объем дополнительного кода, можно отложить заполнение сложного пользовательского интерфейса данными до тех пор, пока они не понадобятся пользователю. Независимо от того, работаете ли вы в .NET Compact Framework или в любой другой среде выполнения для мобильных устройств, откладывание заполнения данными расширяемых элементов управления пользовательских интерфейсов до того момента, когда возникнет действительная необходимость в них, является чрезвычайно мощным методом.
Будьте внимательны, когда работаете с кодом, управляемым событиями
Значительная часть кода современных пользовательских интерфейсов ответственна за реагирование на события, генерируемые каркасом приложения. Знание того, какие события следует обрабатывать, как часто запускаются события и в каких случаях на них целесообразно не реагировать, имеет очень большое значение для создания эффективно функционирующих программных кодов пользовательского интерфейса.
Довольно часто причина низкой производительности приложения кроется в том, что события, генерируемые кодом, ошибочно обрабатываются так, как если бы они были сгенерированы в результате действий пользователя.
Пример: демонстрация возбуждения события, заключающегося в изменении содержимого текстового окна в результате установки значения свойства .Text
В листинге 11.3 содержится код, который необходимо вставить в класс Form. Для создания приложения потребуется выполнить следующие действия:
1. Начните новый проект Smart Device в Visual Studio .NET, выбрав в качестве целевой платформы Pocket PC.
2. Добавьте в форму Form элементы управления TextBox, Label, ListBox и Button.
3. Дважды щелкните на кнопке Button в окне конструктора форм; в результате этого будет создан и подключен к кнопке приведенный ниже обработчик событий button1_Click. Введите соответствующий код из листинга 11.3, который будет реагировать на это событие.