Member 13296680 Ответов: 2

Панели не будут отображаться, когда кнопка пропущена.


У меня есть панель splitcontainer (панель 1 содержит 7 кнопок, панель 2 из разделенного контейнера содержит панели 3-9)

Когда кнопка 1 нажата, она покажет панель 3, кнопка 2 при нажатии покажет панель 4.... но каждый раз, когда я пропускаю кнопку, она не показывает панель нажатой кнопки. Я нажал кнопку 1, она покажет панель 3, но когда я пропущу кнопку 2 и нажму кнопку 3, она не будет отображать панель 5... каждый раз, когда я пропущу кнопки, она не будет показывать назначенные панели... #WindowsAppForm C#

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace kennyrogers
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            splitContainer1.Panel2.Visible = true;
            panel3.Visible = true;
            panel4.Visible = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            panel4.Visible = true;
            panel5.Visible = false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            panel5.Visible = true;
            panel6.Visible = false;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            panel6.Visible = true;
            panel7.Visible = false;

        }

        private void button5_Click(object sender, EventArgs e)
        {
            panel7.Visible = true;
            panel8.Visible = false;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            panel8.Visible = true;
            panel9.Visible = false;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            panel9.Visible = true;
            panel6.Visible = false;
        }
    }
}

2 Ответов

Рейтинг:
2

Graeme_Grant

Вы сами ответили на свой вопрос. Если вы посмотрите на код, то увидите, что не все состояния видимости панели управляются для каждой кнопки. например: код button6 не изменяет состояние видимости panel1 и так далее...

Вы можете либо использовать Шаблон Проектирования Состояния[^] или общий метод и оператор switch. Но для чего-то простого, как описано выше, вы могли бы сделать следующее:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        SetState(States.first);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SetState(States.first);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        SetState(States.second);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        SetState(States.third);
    }

    private void button4_Click(object sender, EventArgs e)
    {
        SetState(States.forth);
    }

    private void button5_Click(object sender, EventArgs e)
    {
        SetState(States.fifth);
    }

    private void button6_Click(object sender, EventArgs e)
    {
        SetState(States.sixth);
    }

    private void button7_Click(object sender, EventArgs e)
    {
        SetState(States.seventh);
    }

    private void button8_Click(object sender, EventArgs e)
    {
        SetState(States.eighth);
    }

    private void button9_Click(object sender, EventArgs e)
    {
        SetState(States.nineth);
    }

    private void SetState(States state)
    {
        panel1.Visible = state == States.first;
        panel2.Visible = state == States.second;
        panel3.Visible = state == States.third;
        panel4.Visible = state == States.forth;
        panel5.Visible = state == States.fifth;
        panel6.Visible = state == States.sixth;
        panel7.Visible = state == States.seventh;
        panel8.Visible = state == States.eighth;
        panel9.Visible = state == States.nineth;
    }
}

enum States
{
    first,
    second,
    third,
    forth,
    fifth,
    sixth,
    seventh,
    eighth,
    nineth
}

** ОБНОВЛЕНИЕ: Если вам нужно, чтобы при нажатии кнопки отображалось более одной панели, вы можете использовать побитовую операцию перечисления с помощью Flags атрибут. Напр.:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        SetState(States.None);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SetState(States.first | States.third);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        SetState(States.second);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        SetState(States.third | States.second);
    }

    private void SetState(States state)
    {
        panel1.Visible = (state & States.first) != 0;
        panel2.Visible = (state & States.second) != 0;
        panel3.Visible = (state & States.third) != 0;
        // and so on...
    }
}

[Flags]
internal enum States
{
    None = 0,
    first = 1,
    second = 2,
    third = 4,
    forth = 8,
    fifth = 16,
    sixth = 32,
    seventh = 64,
    eighth = 128,
    nineth = 256
}


BillWoodruff

Я зарегистрированный владелец превосходных инструментов DoFactory; ваш код не имеет ничего общего с" шаблоном проектирования состояния"... это пример кодирования грубой силы; иногда есть небольшой выбор, кроме как сделать это таким образом ... но в этом случае выбор есть.

Graeme_Grant

Я никогда не говорил, что это так, только упомянул образец. Я регулярно использую шаблоны в своем собственном коде. Но поскольку ОП был новичком, я заявил, что "следующий код" был альтернативой (базовым решением) - "но для чего-то простого, как выше...". :)

Обновление в решении показывает OP, как переключать несколько панелей... У него есть" разделение интересов"," твердый "принцип, Но да, пропущен паттерн" Государственного проектирования", так как это было бы излишним... :)

Рейтинг:
1

BillWoodruff

Note 0. Note that the Panel Control in WinForms is not a full-featured Window with a handle: it does not receive Key events, it will not become Focused as other Controls will. The code in the second example shows one way to get around this by setting Focus to some other Control inside the Panel which is a "full-windowed Control."
Самый простой способ сделать это - во время разработки выбрать все ваши кнопки, которые будут что-то делать с панелями, открыть проводник свойств, выбрать события и дважды щелкнуть по событию Click: теперь VS пишет для вас Click EventHandler, и все, что вам нужно сделать, это написать оператор Switch:
private void button1_Click_1(object sender, EventArgs e)
{
    switch ((sender as Button).Name)
    {
        case "buttonl":
            splitContainer1.Panel2.Visible = true;
            panel3.Visible = true;
            panel4.Visible = false;
            break;
        case "button2":
            // do whatecver
            break;
        
        // and so on ...

        default:
            break;
    }
}
Note: 1. A slightly more complex technique: map the Buttons in the left SplitterPanel to the Panels in the right SplitterPanel using a Dictionary where the Key is a Button, and the Value is an executable function that takes a Panel as a parameter: Dictionary<Button, Action>
public Dictionary<Button, Action> ButtonToAction;

private void Form1_Load(object sender, EventArgs e)
{ 
    ButtonToAction = new Dictionary<Button, Action>
    {
        { button1, () => PanelSelect(panel3)},
        { button2, () => PanelSelect(panel4)},
        { button3, () => PanelSelect(panel5)},
        { button4, () => PanelSelect(panel6)}
    };
}

private void PanelSelect(Panel panel)
{
    // see Note #0 above
    ActiveControl = panel.Controls[0];
    panel.Controls[0].Focus();

    switch (panel.Name)
    {
        case "panel3":
            splitContainer1.Panel2.Visible = true;
            panel3.Visible = true;
            panel4.Visible = false;
            break;
        case "panel4":
            break;
        case "panel5":
            break;
        case "panel6":
            break; 
        default:
            break;         
    }
}


Graeme_Grant

Ваше решение страдает от той же проблемы, что и ОП ... некоторые панели не скрываются, когда показываются другие. Вот что решает Решение 1.

BillWoodruff

Это всего лишь набросок, чтобы показать оператору, как это делается; конечно, он неполон.

Graeme_Grant

Поскольку ОП-новичок, он нуждается в четком руководстве, однако вы повторяете ту же ошибку, которую он сделал по-другому.