1

Тема: Як працювати з сотнями панелей?

Привітульки. Як справи? Ну ви ж знаєте, що я роблю програмку для роботи з БД. Так от, в ній є купа всіляких можливостей. Наприклад, додати книгу, додати користувача і т.д. Такий функціонал в мене реалізований з використанням панелей. Тобто при натисканні на кнопку  "додати книгу", вилазить панель і заповнює все вікно. По замовчуванню цю панель не видно Visible=false;  І от на кожну панельку приходится писати такий код, якщо натиснули щось інше, то цю панель треба витягнути з вікна і зробити невидимою.

pnlAddUser.Dock = DockStyle.None;
                    pnlAddUser.Visible = false;

Так от, як автоматизувати цю штуку, щоб на різних панельках розміщувались різні елементи і щоб переключення між панельками було автоматичним? Наприклад, я натискаю на якусь кнопку, а там лише один код - "показати таку-то панель". І при цьому показується потрібна панель, а всі інші панелі зникають.

2

Re: Як працювати з сотнями панелей?

Я сам в шарпі ніц не шарю, але є така ідея: створити один обробник і присвоїти для всіх панелей(програмно, чи через IDE - на подобі, як у Delphi).
Тобто, аби в обробнику Ви могли працювати із this, який буде вказівником на ту чи іншу панель. Можливо, потрібно буде явне переведення типів чи т.п. В обробнику буде визначати там чи ідентифікатор панельки, індекс тощо. і вже по цьому вирішувати, які елементи  показувати...
А краще заюзайте TPageControl + TVirtualTreeView (брав з делфі, для точності краще загугліть, бо можу помилятись у назвах класів, і міг щось сплутати).

П.С. а чому б не заюзати форми-діалоги для таких завдань? І так, могли б показати скріншот інтерфейсу з отими панельками?)

3

Re: Як працювати з сотнями панелей?

DOP написав:

Я сам в шарпі ніц не шарю, але є така ідея: створити один обробник і присвоїти для всіх панелей(програмно, чи через IDE - на подобі, як у Delphi).
Тобто, аби в обробнику Ви могли працювати із this, який буде вказівником на ту чи іншу панель. Можливо, потрібно буде явне переведення типів чи т.п. В обробнику буде визначати там чи ідентифікатор панельки, індекс тощо. і вже по цьому вирішувати, які елементи  показувати...
А краще заюзайте TPageControl + TVirtualTreeView (брав з делфі, для точності краще загугліть, бо можу помилятись у назвах класів, і міг щось сплутати).

П.С. а чому б не заюзати форми-діалоги для таких завдань? І так, могли б показати скріншот інтерфейсу з отими панельками?)

ну я кароч мало пойняв, але думаю, що можна якось отримати всі контроли і створити массив контролів, а потім якось парсити все в панельку, або якось там просто взяти всі панельки і запихнути до массиву панелей, а потім створити маленький метод і впихнути його до всіх кнопок. А потім якось отримувати панельку до якої належить кнопка, і закривати всі панелькі окрім неї, а її відкривати.

Прихований текст

https://не-дійсний-домен/4djMY.png

Подякували: DOP1

4

Re: Як працювати з сотнями панелей?

отако зробив

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;
using System.Windows.Forms.VisualStyles;

namespace allcontrols
{
    public partial class Form1 : Form
    {
        private Control[] controls;

        public Form1()
        {
            InitializeComponent();
            controls=new Control[this.Controls.Count];
            this.Controls.CopyTo(controls,0);
            richTextBox1.AppendText(controls.Count().ToString());
        }

        private void HideAndShowPanels(Panel pnl)
        {
            foreach (var VARIABLE in controls)
            {
                try
                {
                    Panel pnl1 = (Panel) VARIABLE;
                    if (pnl1 == pnl)
                    {
                        pnl.Visible = true;
                    }
                    else
                    {
                        pnl1.Visible = false;
                    }
                }
                catch (Exception)
                {
                    
                    richTextBox1.AppendText("\n Not a panel!");
                }
            }
        }

        private void panel1ToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            
        }

        private void button3_Click(object sender, EventArgs e)
        {
            
        }

        private void panel1ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel1);
        }

        private void panel2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HideAndShowPanels(panel2);
        }

        private void panel3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HideAndShowPanels(panel3);
        }

        private void panel2ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel2);
        }

        private void panel3ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel3);
        }
    }
}

5 Востаннє редагувалося FakiNyan (28.08.2013 23:42:56)

Re: Як працювати з сотнями панелей?

до речі, як видалити методи-обробники, котрі не використовуються?

6

Re: Як працювати з сотнями панелей?

TRYCUKI_V_KROVI написав:

отако зробив

using System;

        private void panel1ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel1);
        }

        private void panel2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HideAndShowPanels(panel2);
        }

        private void panel3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HideAndShowPanels(panel3);
        }

        private void panel2ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel2);
        }

        private void panel3ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            HideAndShowPanels(panel3);
        }
    }
}

Ну а хіба не можна скоротити код, прописавши ОДНУ процедуру для всіх кліків? Тобто, щось типу такого:

private void panelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HideAndShowPanels(TPanel(sender)); //я хз, чи буде воно так пахати...але суть, думаю що ясна.
        }
...
//в циклі перебрати усі панелі та визначити дану процу як обробник кліку по панелі
//щось типу такого
...
Цикл..
{
PanelN.OnClick = &panelToolStripMenuItem_Click(); // швидше за все - це помилка, але я надіюсь, що вирозумієте, про що я.
}
...

7 Востаннє редагувалося smiler (04.09.2013 15:16:35)

Re: Як працювати з сотнями панелей?

в поле Tag кнопки пишемо ім"я панелі, тоді на все один обробник:

private Control curPanel;

 private void panelToolStripMenuItem_Click(object sender, EventArgs e)
{
  string name = ((ToolStripMenuItem)sender).Tag;
  curPanel.Visible = false;
  curPanel = Controls.Find(name, true); //можна спробувати false якщо панелі є прямими дітьми форми
  curPanel.Visible = true;
}