绑定数据到treeView c#

本文关键字:treeView 数据 绑定 | 更新日期: 2023-09-27 18:01:35

我希望我的程序是这样工作的:1.它从MS SQL中获取数据2.基于此数据(数据行)创建树3.我有几个textBoxex,我想填写基于点击节点的数据。我已经创建了SQL连接类:

 class Baza
{
    private SqlConnection connection;
    string dbdir = "Data Source=CS24''SQLEXPRESS;user id=sa;password=alamakota;database=SHARP;connection timeout=3";
    public Baza()
    {
      connection = new SqlConnection();
      connection.ConnectionString = dbdir;
      connection.Open();
    }
    public DataTable get_data(string q) 
    {
        DataTable dt = new DataTable(); 
        SqlDataReader dr ; 
        SqlCommand sqlc = new SqlCommand(q);
        sqlc.Connection = this.connection;
        dr = sqlc.ExecuteReader();
        dt.Load(dr);
        return dt;
    }
}

和treeView creator:

  private void Form1_Load(object sender, EventArgs e)
    {
        Baza baza = new Baza();
        DataTable dt = new DataTable();
        dt = baza.get_data("Select * from Users order by Id asc");
        foreach (DataRow dr in dt.Rows) 
        {
            TreeNode node = new TreeNode(dr["Name"].ToString() + " " + dr["Surname"].ToString());
            treeView1.Nodes.Add(node);
        }
    }

我认为节点应该有ID,我可以用它来进行数据填充,但我真的不知道怎么做。你能帮我吗?

绑定数据到treeView c#

我遇到了同样的麻烦,我这样做了:

(我有分层数据列ParentID, IsGroup, OrderInGroup)

  • 为TreeViewItems创建一个类

     public class xTreeViewItem : INotifyPropertyChanged
     {
          public int id { get; set; }
          public string Header { get; set; }
          public int parent;
          public List<xTreeViewItem > children { get; set; }
          public bool isGroup = false;
          public bool ParentResolved = false;
          public float order {get;set;}
          public void NotifyPropertyChanged(string info)
          {
               if (PropertyChanged != null)
               {
                     PropertyChanged(this, new PropertyChangedEventArgs(info));
               }
          }
          public event PropertyChangedEventHandler PropertyChanged;
     }
    
  • 现在用SQL Data

    制作一个列表
    private void LoadTree()
    {
        ObservableCollection<xTreeViewItem> treeSource = new ObservableCollection<xTreeViewItem>();
        List<xTreeViewItem> Buffer = new List<xTreeViewItem>();
        foreach (DataRow row in table.Rows)
        {
             xTreeViewItem itm = new TreeViewItem();
             // Load the required heirarchial data
             Buffer.Add(itm);
        }
        for (int i = Buffer.Count - 1; i >= 0; i--)
        {
            if (Buffer[i].parentID != 0)
            {
                if (Buffer[i].ParentResolved)
                    Buffer.RemoveAt(i);
                else
                {
                    Buffer[i].ParentResolved = true;
                    while (Buffer.Any(c => (c.parentID == Buffer[i].menuID && !c.ParentResolved)))
                    {
                        Buffer[i].children.Add(FindChildren(Buffer[i]));
                    }
                    xTreeViewItem parent = Buffer.First(c => c.menuID == Buffer[i].parentID);
                    parent.children.Add(Buffer[i]);
                    Buffer[i].parent = parent;
                    Buffer.RemoveAt(i);
                }
            }
        }
        // remaining items acts as mainItems, so add it to the treeSource
        foreach (xTreeViewItem x in Buffer)
        {
             treeSource.Add(x);
        }
        treeView.ItemsSource = treeSource;
    }
    xTreeViewItem FindChildren(xMenuItem x)
    {
        List<xTreeViewItem > subBuffer = Buffer.Where(c => (c.parentID == x.menuID && !c.ParentResolved)).ToList(); // if there is, get all of them to a list
        subBuffer = subBuffer.OrderBy(c => c.order).ToList();    // << THIS IS CRAZY, BUT FIXES :P // order all of them by their 'order' property
        int indx = Buffer.IndexOf(subBuffer[0]);                                                    // get the first item after ordering
        Buffer[indx].ParentResolved = true;
        Buffer[indx].parent = x;                // changing parentresolved property to prevent infinte loops
        while (Buffer.Any(c => (c.parentID == Buffer[indx].menuID && !c.ParentResolved))) // again checking if the current child got any other child.
        {
            Buffer[indx].children.Add(FindChildren(Buffer[indx])); // adding all the childs                     
        }
        return Buffer[indx]; // return the child
    }
    

在XAML中:把这个作为TreeView的ItemTemplate:)

    <TreeView.ItemTemplate>
          <HierarchicalDataTemplate ItemsSource="{Binding children}">
                  <ContentPresenter Content="{Binding Header}" Margin="2,0"/>
          </HierarchicalDataTemplate>
     </TreeView.ItemTemplate>

这个为我做了工作:p要获取选中的项目,只需使用:

xTreeViewItem selectedItem = (xTreeViewItem)treeView.SelectedItem;

让你的视图更新这个'selectedItem';.. :)

希望有帮助:)

**有时项目可能出现颠倒。简单地给出List.Reverse();在这种情况下,我没有自己运行代码,无论如何,这应该适用于所有类型,如从数据库加载菜单项和显示(如果你有多种语言,这很有用):)

**我才18岁:p没有CS学位,这只是我想出来的一个代码:)是的,可能有缺陷,但它适用于我:p

:)