簡體   English   中英

當用戶單擊 treeview 節點時,tabcontrol 發生變化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM