当用户单击树视图节点时,表控件发生变化
本文关键字:控件 变化 单击 用户 视图 节点 | 更新日期: 2023-09-27 18:03:04
这是我的应用程序的概述:
这基本上是一本烹饪书。用户可以创建一个食谱,然后在这个食谱中创建食谱。我有一本班级烹饪书和一个班级食谱。CookBook跟踪哪些食谱与烹饪书相关联,Recipe跟踪食谱的内容。
对于UI,我有一个树视图,它将显示CookBook中的食谱。我有一个TabControl,它将显示与每个食谱相关联的选项卡。选项卡是由用户在运行时动态创建的。
当用户单击其中一个食谱时,我希望TabControl显示与该特定食谱相关的选项卡。当用户点击不同的食谱时,我希望以前选择的选项卡消失,当前选择的选项卡出现。(旁注:我将保存选项卡的内容和东西到一个文件后,保存的目的)
我希望Recipe类包含TabControl的详细信息(菜谱有多少个选项卡,每个选项卡的标题,选项卡的内容)。但是我不希望Recipe负责创建tab或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容器)中显示Recipe的任务,并使用它来处理与用户的交互。视图通常与"容器"紧密耦合(在这种情况下是表单本身),尽管它也可以被抽象。D/V在其最基本的形式是非常类似于MVC模式,虽然你可以去掉控制器部分,如果你的应用程序足够简单。这里有一些关于这个主题的轻松读物。不要担心它指的是MFC,无论如何方法都是一样的。关于MVC的文档可能也很有用,但它倾向于关注基于web的应用程序。
有趣的东西:)
我的一种方法是让每个Treeview的项都有一个对它所代表的Recipe类的引用。Treeview将触发在表单上捕获的选择更改事件,您可以从中提取Recipe实例。然后,这将把Recipe实例传递给TabControl, TabControl将根据Recipe信息配置自己。
要完成这一点,我可能有一个自定义类派生自Treeview和一个来自TabControl的方法,如MyTreeview。DisplayCookBook(CookBook book)和MyTabControl。DisplayRecipe(食谱配方)。这将把功能封装在各自的容器中,并通过事件相互通信,避免有1000行代码的表单。