![](/img/trans.png)
[英]C# treeView, how do I get the parent nodes when user clicks the child node
[英]tabcontrol changing when user clicks on treeview node
这是我的应用程序的概述:
它基本上是一本烹饪书。 用户可以创建食谱,然后在该食谱中创建食谱。 我有一本 class 食谱和一本 class 食谱。 CookBook 跟踪与食谱相关的食谱,Recipe 跟踪食谱的内容。
对于 UI,我有一个 treeview,它将显示 CookBook 中的食谱。 我有一个 TabControl,它将显示与每个配方关联的选项卡。 选项卡由用户在运行时动态创建。
当用户单击其中一个食谱时,我希望 TabControl 显示与该特定食谱相关的选项卡。 当用户单击不同的食谱时,我希望将先前选择的选项卡移至 go 并显示当前选择的选项卡。 (旁注:我稍后会将选项卡和内容的内容保存到文件中,以供保存)
我希望配方 class 包含有关 TabControl 的详细信息(配方有多少选项卡,每个选项卡的标题,选项卡的内容)。 但我不希望Recipe 负责创建Tabs 或TabControl。
我的问题是,我如何完成上面的粗体部分? 人们对这类问题有何看法和经验? 此类问题的最佳实践是什么?
谢谢!
希望下面的代码能给你一个思路
public Form1()
{
InitializeComponent();
Recipe r1 = new Recipe() { Text = "Re1" };
Recipe r2 = new Recipe() { Text = "Re2" };
Recipe r3 = new Recipe() { Text = "Re3" };
listBox1.Items.Add(r1);
listBox1.Items.Add(r2);
listBox1.Items.Add(r3);
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r1,Text=r1.ToString() });
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r2, Text = r2.ToString() });
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r3, Text = r3.ToString() });
listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
}
void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem != null)
foreach (AdvancedTabPage ad in tabControl1.TabPages)
{
if (ad.Recipe == listBox1.SelectedItem)
{
tabControl1.SelectedTab = ad;
break;
}
}
}
public class AdvancedTabPage : System.Windows.Forms.TabPage
{
public Recipe Recipe{get;set;}
}
public class Recipe
{
public string Text = "";
public override string ToString()
{
return Text;
}
}
这是我假设的 WinForms 应用程序? 您遇到了经典的 UI 关注点分离问题。 大多数开发人员(干净地)解决这个问题的方法是实现文档/视图 model 之类的东西。 多亏了 MFC,一个加载的术语,但仍然有用。
基本上,您的食谱 class 就是文档。 选项卡是视图。 创建一个 class 来处理在选项卡(或任何其他 UI 容器)中显示配方的任务,并使用它来处理与用户的交互。 视图通常与“容器”(在这种情况下是表单本身)紧密耦合,尽管它也可以被抽象出来。
最基本形式的 D/V 与MVC模式非常相似,尽管如果您的应用程序足够简单,您可以取消 controller 部分。 这里有一些关于这个主题的简单读物。 不要担心它指的是MFC,无论如何方法都是一样的。 有关 MVC 的文档也可能有用,但它往往侧重于基于 Web 的应用程序。
好玩的东西:)
我解决这个问题的一种方法是让每个 Treeview 的项目都引用它所代表的配方 class。 Treeview 将触发在表单上捕获的选择更改事件,您可以在其中提取配方实例。 然后这会将Recipe 实例传递给TabControl,TabControl 将根据Recipe 信息进行自我配置。
为了做到这一点,我可能有一个自定义 class 派生自 Treeview 和一个来自 TabControl 的方法,例如 MyTreeview.DisplayCookBook(CookBook book)和 MyTabControl.DisplayRecipe(Recipe recipe)。 这将在各自的容器中封装功能,并通过事件相互通信,避免使用 1000 行代码的表单。
希望能给你一些方向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.