繁体   English   中英

将数据绑定到TreeView C#

[英]Binding data to treeView c#

我希望我的程序像这样工作: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创建者:

  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,但我真的不知道该怎么做。 你能帮我吗?

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

(我在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数据列出

     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();即可。 在这种情况下,我还没有亲自运行代码,无论如何,它应该适用于所有类型,例如从数据库加载MenuItems并进行显示(如果您使用多种语言,则很有用):)

**我才18岁:P还没有CS学位,这只是我想出的一条代码:)是的,可能有缺陷,但对我有用:P

:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM