Книга: Программирование мобильных устройств на платформе .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 или в любой другой среде выполнения для мобильных устройств, откладывание заполнения данными расширяемых элементов управления пользовательских интерфейсов до того момента, когда возникнет действительная необходимость в них, является чрезвычайно мощным методом.

Оглавление книги


Генерация: 4.987. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз