用户单击treeview节点时tabcontrol更改

以下是我的应用程序概述:

它基本上是一本烹饪书。 用户可以创建食谱,然后在该食谱中创建食谱。 我有一堂课CookBook和一堂课。 CookBook记录了与烹饪书相关的食谱,食谱跟踪食谱的内容。

对于UI,我有一个树视图,它将显示CookBook中的食谱。 我有一个TabControl,它将显示与每个配方相关的选项卡。 选项卡在运行时由用户动态创建。

当用户点击其中一个食谱时,我希望TabControl显示与该特定食谱相关的选项卡。 当用户点击不同的配方时,我希望上一个选择的选项卡消失,并显示当前选择的选项卡。 (旁注:为了节省目的,我将稍后将选项卡的内容和内容保存到文件中)

我希望Recipe类包含有关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分离问题。 大多数开发人员解决这个问题的方式(干净利落)是通过实现类似文档/视图模型的方式。 由于MFC而加载的术语,但仍然有用。

基本上,您的Recipe类是文档。 选项卡是视图。 创建一个类来处理在选项卡(或任何其他UI容器)中显示配方的任务,并使用它来处理与用户的交互。 View通常与’容器’(在这种情况下将是表单本身)紧密耦合,尽管它也可以被抽象化。

最基本forms的D / V与MVC模式非常相似,但如果您的应用程序足够简单,您可以取消控制器部分。 这里有一些关于这个主题的轻读。 不要担心它指的是MFC,无论如何都是一样的。 关于MVC的文档也可能有用,但它往往侧重于基于Web的应用程序。

好玩的东西 :)

我接近这个的一种方法是每个Treeview的项目都引用它所代表的Recipe类。 Treeview将触发在表单上捕获的选择更改事件,您可以在其中提取Recipe实例。 然后,这会将Recipe实例传递给TabControl,TabControl将根据配方信息进行自我配置。

为了实现这一点,我可能有一个派生自Treeview的自定义类和一个来自TabControl的自定义类,其中包含MyTreeview.DisplayCookBook(CookBook book)和MyTabControl.DisplayRecipe(Recipe recipe)等方法。 这将在各自的容器中封装function,并通过事件相互通信,避免使用包含1000行代码的表单。

希望能给你一些指导。