2014-10-17 3 views
0

У меня есть встроенная работающая логика в WinForms для вставки данных в TreeView, которая поступает из БД, поэтому я не могу просто поставить datatable позади древовидного изображения и быть счастливым, потому что мне нужно строить узлы и undernodes и undernodes и т.д. Рабочий код в старых WinForms:WPF - TreeView добавляет детей к детям полностью динамически

private void waregroup() 
    { 
     DataSet myDataSet = new DataSet(); 
     DataTable myDataTable = new DataTable(); 
     string sqlStatement = "SELECT * FROM APWGRUPP ORDER BY WG_WGSCHL ASC"; 
     string str_key = ""; 
     string str_desc = ""; 
     int int_node0 = 0; 
     int int_node1= 0; 
     int int_node2 = 0; 
     int int_node3 = 0; 
     int int_node4 = 0; 

     myDataSet = ImportDBF(sqlStatement); 
     myDataTable = myDataSet.Tables["Table"]; 
     foreach (DataRow row in myDataTable.Rows) 
     { 
      str_desc = row.Field<string>(1); 
      str_key = row.Field<string>(2); 
      switch (str_key.Length) 
      { 
       case 1: 
        trv_waregroup.Nodes.Add(str_key + "-" + str_desc); 
        int_node0++; 
        int_node1 = 0; 
        int_node2 = 0; 
        int_node3 = 0; 
        int_node4 = 0; 
        break; 
       case 2: 
        trv_waregroup.Nodes[int_node0 - 1].Nodes.Add(str_key + "-" + str_desc); 
        int_node1++; 
        int_node2 = 0; 
        int_node3 = 0; 
        int_node4 = 0; 
        break; 
       case 4: 
        trv_waregroup.Nodes[int_node0 - 1].Nodes[int_node1 - 1].Nodes.Add(str_key + "-" + str_desc); 
        int_node2++; 
        int_node3 = 0; 
        int_node4 = 0; 
        break; 
       case 5: 
        trv_waregroup.Nodes[int_node0 - 1].Nodes[int_node1 - 1].Nodes[int_node2 - 1].Nodes.Add(str_key + "-" + str_desc); 
        int_node3++; 
        int_node4 = 0; 
        break; 
       case 6: 
        trv_waregroup.Nodes[int_node0 - 1].Nodes[int_node1 - 1].Nodes[int_node2 - 1].Nodes[int_node3 - 1].Nodes.Add(str_key + "-" + str_desc); 
        int_node4++; 
        break; 
       default: 
        trv_waregroup.Nodes[int_node0 - 1].Nodes[int_node1 - 1].Nodes[int_node2 - 1].Nodes[int_node3 - 1].Nodes[int_node4 - 1].Nodes.Add(str_key + "-" + str_desc); 
        break; 
      } 
     } 
    } 

Теперь я не могу использовать логику с Items [Счетчик] .Add больше, но единственно возможное решение, я могу думать о том, используя перечисление. Но все, что я нашел, это использование заголовка как нового элемента для добавления нового узла в.

Я попробовал этот способ, но не получают годный к употреблению товара для работы с:

TreeViewItem temp = (TreeViewItem)_WareGroups.Items.GetItemAt(Node0 - 1); 
_WareGroups.Items.Add(GroupKey + "-" + GroupDesc); 

Каждый получил представление о том, как я могу добавить мои почти 2500 Items этот путь?

+0

если это WPF, пожалуйста, удалите все, что ужасный код немедленно и начать чтение [здесь] (http://msdn.microsoft.com/en-us/library/ms752347 (v = vs.110) .aspx) и [здесь] (http: //www.codeproject. ком/Arti Cles/26288/Упрощая-The-МОФ-TreeView-на-Использование-The-ViewMode). –

+0

В принципе, вы не добавляете узлы в TreeView или «создаете TreeViewItems» или что-то в этом коде в WPF. Вместо этого вы создадите правильную [Иерархическую структуру данных] (http://stackoverflow.com/questions/5386239/generics-and-parent-child-architecture), подходящую для использования [HierarchicalDataTemplate] (http: // blogs .msdn.com/б/mikehillberg/архив/2009/10/30/TreeView-и-HierarchicalDataTemplate-шаг за step.aspx). BTW. Также настоятельно рекомендуется, чтобы у вас было минимальное уважение к расслоению и перемещение кода, связанного с БД, с уровня пользовательского интерфейса. –

+0

И, пожалуйста, используйте правильную оболочку для имен методов. Это должно быть 'WareGroup()', если угодно. –

ответ

0

Хорошо, я нашел решение. Если кто-то интересуется:

XAML:

<TreeView ItemsSource="{Binding Items}" Height="{Binding ElementName=AdminConsoleWindow, Path=ActualHeight, Converter={StaticResource MathConverter}, ConverterParameter=(@VALUE/3)}"> 
    <TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding SubItems}"> 
     <TextBlock Text="{Binding Header}"/> 
    </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Code-Behind:

public partial class AdminConsole : Window 
{ 
    public ObservableCollection<MyItem> Items { get; set; } 

    public AdminConsole() 
    { 
     this.Items = new ObservableCollection<MyItem>(); 
     this.DataContext = this; 
     InitializeComponent(); 
    } 

    private void AddWareGroups() 
    { 
     DataTable MyTable = DBase.GetWareGroups(); 
     foreach (DataRow MyRow in MyTable.Rows) 
     { 
      string ItemDescription = MyRow.Field<string>(1); 
      string ItemKey = MyRow.Field<string>(2); 
      MyItem NewItem = new MyItem(); 
      NewItem.Header = ItemKey + " - " + ItemDescription; 
      if (ItemKey.Length == 1) 
      { 
       this.Items.Add(NewItem); 
      } 
      else if (ItemKey.Length == 2 || ItemKey.Length == 5 || ItemKey.Length == 6) 
      { 
       IterateSubItems(1, NewItem, ItemKey, this.Items); 
      } 
      else // if (ItemKey.Length == 4 || ItemKey.Length == 8) 
      { 
       IterateSubItems(2, NewItem, ItemKey, this.Items); 
      } 
     } 
    } 

    private void IterateSubItems(int shortenLength, MyItem newItem, string itemKey, ObservableCollection<MyItem> myCollection) 
    { 
     foreach (MyItem ItemChild in myCollection) 
     { 
      if (ItemChild.Header.Substring(0, ItemChild.Header.IndexOf(" - ")).Equals(itemKey.Substring(0, itemKey.Length - shortenLength))) 
      { 
       ItemChild.SubItems.Add(newItem); 
       return; 
      } 
      else 
      { 
       if (ItemChild.SubItems.Count > 0) 
       { 
        IterateSubItems(shortenLength, newItem, itemKey, ItemChild.SubItems); 
       } 
      } 
     } 
    } 

И в экстра-класса:

public class MyItem : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged Members 
    protected void OnPropertyChanged(string propertyName) 
    { 
     var evt = this.PropertyChanged; 
     if (evt != null) 
      evt(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion 

    private string _Header = "Item"; 
    public string Header 
    { 
     get 
     { 
      return this._Header; 
     } 
     set 
     { 
      if (this._Header != value) 
      { 
       this._Header = value; 
       this.OnPropertyChanged("Header"); 
      } 
     } 
    } 
    private ObservableCollection<MyItem> _SubItems = new ObservableCollection<MyItem>(); 
    public ObservableCollection<MyItem> SubItems 
    { 
     get 
     { 
      return this._SubItems; 
     } 
     set 
     { 
      if (this._SubItems != value) 
      { 
       this._SubItems = value; 
       this.OnPropertyChanged("SubItems"); 
      } 
     } 
    } 
} 
-1

Нечто подобное:

foreach (DataRow row in myDataTable.Rows) 
{ 
    str_desc = row.Field<string>(1); 
    str_key = row.Field<string>(2); 

    TreeNode node = new TreeNode(str_key + "-" + str_desc); 

    int lvl = 1; 

    addToLvl(lvl, trv_waregroup, trv_waregroup.Nodes[trv_waregroup.GetNodeCount(false) - 1], str_key.Length, node); 

} 

public void addToLvl(int actualLvl, TreeView tv, TreeNode last, int lvlToReach, TreeNode nodeToAdd) 
{ 
    if (actualLvl == lvlToReach) 
    last.Add(node); //wpf ?? last.Nodes.Add(node); 
    else 
    addToLvl(actualLvl++, tv, last.LastNode, lvlToreach, nodeToAdd); 
} 
+0

last.Nodes больше не существует в WPF, теперь его items.add, но больше нет узлов [2] .Nodes [5] .Nodes.Add. Это моя проблема. –

+0

и? мое решение работает –

+0

Я бы сказал, что да, но вы используете что-то вроде trv_waregroup.Nodes [trv_waregroup.GetNodeCount (false) - 1], и это не работает. Вы больше не можете адресовать узлы на индекс. –