[英]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.