Программная обработка динамического диапазона элементов формы пользовательского интерфейса C#.

Я хочу оптимизировать свой код C# для динамического отображения от 1 до 10 элементов в форме. То, как я это реализовал в настоящее время, неуклюже и не очень удобно в обслуживании, поэтому я надеялся, что это можно будет переписать в функцию, которая может обрабатывать, например. по одному элементу за раз.

У меня есть форма пользовательского интерфейса ниже, которая состоит из 10 textBox и 10 pictureBox:

В зависимости от числа showElements, которое у меня есть, оно должно отображать от 1 до 10 таких полей (как текстовое поле, так и поле изображения). Мой текущий код таков:

// How many boxes to show
int showElements = 4;

// Show X elements
for (int i = 1; i <= showElements; i++)
{

    // Show specific element
    switch (i)
    {
        case 1:
            textBox1.Width = width - widthSubstract;
            pictureBox1.Width = width - widthSubstract;
            break;
        case 2:
            textBox2.Width = width - widthSubstract;
            pictureBox2.Width = width - widthSubstract;
            break;
        ... CUT but similar code up to 10

// Hide remaining elements
for (int i = showlements; i <= 10; i++)
switch (i)
        {
            case 1:
                textBox1.Visible = false;
                pictureBox1.Visible = false;
                break;
            case 2:
                textBox2.Visible = false;
                pictureBox2.Visible = false;
                break;
            ... CUT but similar code up to 10

.. в остальном вы получаете тривиальную точку. У меня есть больше кода в каждом case, но все они относятся к конкретному textBox или imageBox, которые должны быть показаны.

Я не могу понять, как я могу оптимизировать это? :-)

Вы когда-нибудь слышали о массивах? Вам действительно не нужны эти textBox1... Скорее, имейте массив, инициализируйте его, установите свойства и добавьте каждый элемент массива в элементы управления формы.

Wiktor Zychla 18.12.2020 17:30
TableLayoutPanel кто-нибудь?
JAlex 18.12.2020 17:32

Предлагаемое решение: создайте пользовательский элемент управления с одним налоговым полем и одним pbox. Добавляйте или удаляйте экземпляры этого UC в/из FlowLayoutpanel!

TaW 18.12.2020 17:37
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете добавлять элементы пользовательского интерфейса по запросу, вместо того, чтобы предварительно определять их в своем приложении.

for(int i = 0; i < 10; i++)
{
    TextBox textBox = new TextBox();
    textBox.Text = "Hello";
    textBox.Tag = i;
    this.Controls.Add(textBox);
}

Затем снова получите к ним доступ через свойство Control.

(this.Controls[i] as TextBox).Text += " World!";

В вашем конкретном случае вы можете определить пользовательский элемент управления, содержащий textBox и PictureBox. Затем добавьте этот пользовательский элемент управления в качестве дочернего элемента.

Как мне получить доступ к элементам - например. изменить текст в текстовом поле?

Beauvais 18.12.2020 17:44

(this.Controls[i] as TextBox).Text = "ваш новый текст"

Bin4ry 18.12.2020 21:07

Я обнаружил это и сам, но было бы неплохо, если бы вы могли обновить свой ответ для будущих читателей :-) Тогда я приму ваш ответ, так как к нему легко относиться.

Beauvais 18.12.2020 21:44

Я делаю это так:

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

            PictureText[] pictureTexts = new PictureText[] {
                new PictureText { textbox = textBox1, picturebox = pictureBox1},
                new PictureText { textbox = textBox2, picturebox = pictureBox2},
                new PictureText { textbox = textBox3, picturebox = pictureBox3},
                new PictureText { textbox = textBox4, picturebox = pictureBox4},
                new PictureText { textbox = textBox5, picturebox = pictureBox5},
                new PictureText { textbox = textBox6, picturebox = pictureBox6},
                new PictureText { textbox = textBox7, picturebox = pictureBox7},
                new PictureText { textbox = textBox8, picturebox = pictureBox8},
                new PictureText { textbox = textBox9, picturebox = pictureBox9},
                new PictureText { textbox = textBox10, picturebox = pictureBox10}
            };
        }
    }
    public class PictureText
    {
        public TextBox textbox { get; set; }
        public PictureBox picturebox { get; set; }
    }

Это может быть выше моего опыта в C# ;-) Я не понимаю, как использовать get или set в этом, и если бы было возможно иметь даже динамическое количество элементов вместо инициализации массива с фиксированным количеством элементов, это будет лучше, я думаю.

Beauvais 18.12.2020 17:47

Get/set можно игнорировать, это просто синтаксис, который нравится компилятору. Если вам нужен динамический массив, вы можете использовать List<PictureText> вместо PictureText[]

jdweng 18.12.2020 17:54

Другие вопросы по теме