Книга: Программирование мобильных устройств на платформе .NET Compact Framework
Листинг 11.2. Динамическое заполнение данными элемента управления TreeView
Листинг 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; //Разрешить беспрепятственное продолжение выполнение
}
//------------------------------------------------------------
//Требуется динамическое заполнение дерева данными.
//Мы знаем, что узел должен быть заполнен данными; определить,
//что это за узел
//------------------------------------------------------------
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 или в любой другой среде выполнения для мобильных устройств, откладывание заполнения данными расширяемых элементов управления пользовательских интерфейсов до того момента, когда возникнет действительная необходимость в них, является чрезвычайно мощным методом.
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Заполнение справочников и каталогов
- Основные "рычаги" управления производительностью
- Категорийный менеджмент. Курс управления ассортиментом в рознице
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Письма с элементами графики и вложениями
- 1. Системы управления базами данных
- 4.8 Методы управления Fibre Channel
- 7.9 Будущее управления хранилищами по версии ассоциации SNIA: стандарты SMI
- 15.1.3. Обработка сигналов управления заданиями
- Группа управления конфигурацией ПО
- 6.2. Создание и автоматическое заполнение бланков стандартных документов