绑定数据到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,我可以用它来进行数据填充,但我真的不知道怎么做。你能帮我吗?
我遇到了同样的麻烦,我这样做了:
(我有分层数据列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
:)