Выбрать главу

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