изменение tabcontrol, когда пользователь нажимает на узел дерева - PullRequest
1 голос
/ 23 июля 2011

Вот краткий обзор моего приложения:

Это в основном поваренная книга.Пользователь может создать кулинарную книгу, а затем создать рецепты в этой кулинарной книге.У меня есть класс CookBook и класс Recipe.CookBook отслеживает, какие рецепты связаны с кулинарной книгой, а Recipe отслеживает содержимое рецепта.

Для пользовательского интерфейса у меня есть древовидное представление, в котором будут отображаться рецепты, находящиеся в CookBook.У меня есть TabControl, который будет отображать вкладки, связанные с каждым рецептом.Вкладки динамически создаются пользователем во время выполнения.

Когда пользователь нажимает на один из рецептов, я хочу, чтобы TabControl показывал вкладки, связанные с этим конкретным рецептом.Когда пользователь нажимает на другой рецепт, я хочу, чтобы закладки предыдущего выбора исчезли, а вкладки текущего выбора появились.(примечание: я буду сохранять содержимое вкладки и прочее в файл позже для целей сохранения)

Я хочу, чтобы класс Recipe содержал подробную информацию о TabControl (сколько там вкладок)для рецепта, название каждой из вкладок, содержание вкладок).Но я не хочу, чтобы Recipe отвечал за создание вкладок или TabControl.

Мои вопросы: как мне выполнить выделенный жирным шрифтом раздел выше?Каковы мнения и опыт людей с этим типом проблемы?Каковы наилучшие методы для такого рода проблем?

СПАСИБО!

Ответы [ 3 ]

4 голосов
/ 23 июля 2011

Я надеюсь, что следующий код дает вам представление

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 голос
/ 23 июля 2011

Один из способов, с помощью которого я бы подошел к этому, - чтобы каждый элемент Treeview имел ссылку на класс Recipe, который он представляет.Древовидное представление вызовет событие изменения выбора, захваченное в форме, где вы можете извлечь экземпляр рецепта.Затем он передаст экземпляр Recipe в TabControl, который настроит себя на основе информации о рецепте.

Для этого у меня, вероятно, будет собственный класс, производный от Treeview, и один из TabControl с такими методами, какMyTreeview.DisplayCookBook (книга кулинарной книги) и MyTabControl.DisplayRecipe (рецепт рецепта).Это будет инкапсулировать функциональность в их соответствующих контейнерах и будет взаимодействовать друг с другом через события, избегая формы с 1000 строками кода.

Надеюсь, что это даст вам некоторое направление.

1 голос
/ 23 июля 2011

Это приложение WinForms?Вы столкнулись с проблемой разделения классического пользовательского интерфейса.Способ, которым большинство разработчиков решают это (чисто), заключается в реализации чего-то вроде модели документа / представления.Термин загружен благодаря MFC, но тем не менее полезен.

По сути, ваш класс Recipe - это документ.Вкладки являются видом.Создайте класс, который обрабатывает задачи отображения рецепта на вкладках (или в любом другом контейнере пользовательского интерфейса), и используйте его также для взаимодействия с пользователем.Представление обычно тесно связано с «контейнером» (который в данном случае будет самой формой), хотя это также может быть абстрагировано.

D / V в своей основной форме очень похож на MVC , хотя вы можете покончить с контроллером, если ваше приложение достаточно простое. Здесь - небольшое чтение по теме.Не беспокойтесь о том, что это относится к MFC, подход одинаков независимо.Документация по MVC также может быть полезной, но она, как правило, фокусируется на веб-приложениях.

Прикольные вещи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...