在C#中,使用WinForms或WPF中的TreeView控件可以实现动态加载。这里分别给出两种方法的示例:
首先,在WinForms中创建一个TreeView控件和一个ImageList控件。将ImageList与TreeView关联,并设置其图像列表。
// 在WinForms设计器中添加TreeView控件和ImageList控件 private TreeView treeView; private ImageList imageList; // 在构造函数或窗体的Load事件处理程序中初始化组件 public Form1() { InitializeComponent(); // 初始化TreeView和ImageList treeView = new TreeView(); imageList = new ImageList(); // 设置ImageList的图像资源 imageList.Images.Add("folder", Properties.Resources.folder_icon); imageList.Images.Add("file", Properties.Resources.file_icon); // 将ImageList与TreeView关联 treeView.ImageList = imageList; // 设置TreeView的属性 treeView.Dock = DockStyle.Fill; treeView.AllowNodeEditing = false; treeView.ShowLines = true; treeView.AutoScroll = true; // 将TreeView添加到窗体中 this.Controls.Add(treeView); } 接下来,为TreeView控件添加一个事件处理程序,以便在展开节点时动态加载子节点。
// 为TreeView控件添加NodeMouseClick事件处理程序 private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == MouseButtons.Right) { TreeNode node = e.Node; contextMenuStrip1.Show(treeView, e.Location); } } 现在,为TreeView控件添加一个方法,用于动态加载子节点。
// 动态加载子节点的方法 private void LoadChildNodes(TreeNode parentNode) { // 清除现有子节点 parentNode.Nodes.Clear(); // 模拟从数据源获取子节点数据 List<string> childNodes = GetChildNodesFromDataSource(parentNode.Text); // 添加子节点 foreach (string childNodeText in childNodes) { TreeNode childNode = new TreeNode(childNodeText); childNode.ImageIndex = 0; // 使用文件夹图像 childNode.SelectedImageIndex = 0; parentNode.Nodes.Add(childNode); } } // 模拟从数据源获取子节点数据的方法 private List<string> GetChildNodesFromDataSource(string parentNodeText) { // 在这里实现从数据源获取子节点的逻辑 // 例如,从数据库或XML文件中读取子节点数据 List<string> childNodes = new List<string>(); childNodes.Add("Child Node 1"); childNodes.Add("Child Node 2"); childNodes.Add("Child Node 3"); return childNodes; } 最后,为TreeView控件的KeyDown事件处理程序添加代码,以便在按下Enter键时加载子节点。
// 为TreeView控件添加KeyDown事件处理程序 private void treeView_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { TreeNode selectedNode = treeView.SelectedNode; if (selectedNode != null) { LoadChildNodes(selectedNode); } } } 现在,当用户展开TreeView节点时,将自动加载子节点。
首先,在WPF中创建一个TreeView控件和一个ImageList控件。将ImageList与TreeView关联,并设置其图像列表。
<!-- 在WPF设计器中添加TreeView控件和ImageList控件 --> <Window.Resources> <local:ImageConverter x:Key="ImageConverter"/> </Window.Resources> <Grid> <TreeView x:Name="treeView" ItemsSource="{Binding TreeData}" SelectedValuePath="Key"> <TreeView.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Image Source="{Binding Value.Icon}" Width="16" Height="16" Margin="0,0,5,0" VerticalAlignment="Center"/> <TextBlock Text="{Binding Key}" VerticalAlignment="Center"/> </StackPanel> </DataTemplate> </TreeView.ItemTemplate> </TreeView> </Grid> 接下来,为TreeView控件添加一个方法,用于动态加载子节点。
// 动态加载子节点的方法 private void LoadChildNodes(TreeNode parentNode) { // 清除现有子节点 parentNode.Items.Clear(); // 模拟从数据源获取子节点数据 List<KeyValuePair<string, object>> childNodes = GetChildNodesFromDataSource(parentNode.Header.ToString()); // 添加子节点 foreach (KeyValuePair<string, object> childNode in childNodes) { TreeNode newChildNode = new TreeNode(childNode.Key); newChildNode.Header = childNode.Value; parentNode.Items.Add(newChildNode); } } // 模拟从数据源获取子节点数据的方法 private List<KeyValuePair<string, object>> GetChildNodesFromDataSource(string parentNodeText) { // 在这里实现从数据源获取子节点的逻辑 // 例如,从数据库或XML文件中读取子节点数据 List<KeyValuePair<string, object>> childNodes = new List<KeyValuePair<string, object>>(); childNodes.Add(new KeyValuePair<string, object>("Child Node 1", null)); childNodes.Add(new KeyValuePair<string, object>("Child Node 2", null)); childNodes.Add(new KeyValuePair<string, object>("Child Node 3", null)); return childNodes; } 最后,为TreeView控件的SelectedItemChanged事件处理程序添加代码,以便在选中节点时加载子节点。
// 为TreeView控件添加SelectedItemChanged事件处理程序 private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { TreeNode selectedNode = treeView.SelectedItem as TreeNode; if (selectedNode != null) { LoadChildNodes(selectedNode); } } 现在,当用户展开TreeView节点时,将自动加载子节点。