当用户单击树视图节点时,表控件发生变化

本文关键字:控件 变化 单击 用户 视图 节点 | 更新日期: 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行代码的表单。