用户单击treeview节点时tabcontrol更改

时间:2011-07-22 20:21:25

标签: c# visual-studio-2010 oop tabcontrol

以下是我的申请概述:

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

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

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

我希望Recipe类包含有关TabControl的详细信息(配方有多少个选项卡,每个选项卡的标题,选项卡的内容)。但我不希望Recipe负责创建Tabs或TabControl。

我的问题是,我如何完成上面的粗体部分?人们对这类问题的看法和经验是什么?这类问题的最佳做法是什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

我希望以下代码为您提供一个想法

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;
        }
    }

答案 1 :(得分:1)

这是我假设的WinForms应用程序?您已经遇到了关注问题的经典UI分离问题。大多数开发人员解决这个问题的方式(干净利落)是通过实现类似文档/视图模型的方式。一个加载的术语归功于MFC,但仍然有用。

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

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

有趣的东西:)

答案 2 :(得分:1)

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

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

希望能给你一些指导。