Я хочу оптимизировать свой код 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, которые должны быть показаны.
Я не могу понять, как я могу оптимизировать это? :-)
TableLayoutPanel
кто-нибудь?
Предлагаемое решение: создайте пользовательский элемент управления с одним налоговым полем и одним pbox. Добавляйте или удаляйте экземпляры этого UC в/из FlowLayoutpanel!
Вы можете добавлять элементы пользовательского интерфейса по запросу, вместо того, чтобы предварительно определять их в своем приложении.
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. Затем добавьте этот пользовательский элемент управления в качестве дочернего элемента.
Как мне получить доступ к элементам - например. изменить текст в текстовом поле?
(this.Controls[i] as TextBox).Text = "ваш новый текст"
Я обнаружил это и сам, но было бы неплохо, если бы вы могли обновить свой ответ для будущих читателей :-) Тогда я приму ваш ответ, так как к нему легко относиться.
Я делаю это так:
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 в этом, и если бы было возможно иметь даже динамическое количество элементов вместо инициализации массива с фиксированным количеством элементов, это будет лучше, я думаю.
Get/set можно игнорировать, это просто синтаксис, который нравится компилятору. Если вам нужен динамический массив, вы можете использовать List<PictureText> вместо PictureText[]
Вы когда-нибудь слышали о массивах? Вам действительно не нужны эти textBox1... Скорее, имейте массив, инициализируйте его, установите свойства и добавьте каждый элемент массива в элементы управления формы.