Если вам необходимо добавить элементы управления во время выполнения, основываясь на некотором динамическом или изменяющемся значении, вы можете рассмотреть возможность создания изображения на лету и захвата событий щелчка мыши на его окне рисунка. Это было бы намного быстрее и иметь только один элемент управления, а не сотни. Вы потеряете некоторые функции кнопок, такие как анимация щелчка и другие автоматические свойства и события; но вы можете воссоздать большинство из них при создании изображения.
Это метод, который я использую, чтобы предложить пользователям возможность включать и выключать отдельные устройства из пула тысяч, когда местоположение в двухмерном пространстве имеет значение. Если расположение кнопок неважно, возможно, вам лучше предложить список элементов в виде списка или комбинированного списка, или, как предлагают другие ответы, в виде сетки данных со столбцами кнопок.
EDIT:
Пример, показывающий, как добавить графику с виртуальными кнопками. Очень простая реализация, но, надеюсь, вы получите идею:
Во-первых, некоторые начальные переменные в качестве предпочтений:
int GraphicWidth = 300;
int GraphicHeight = 100;
int ButtonWidth = 60;
int ButtonHeight = 20;
Font ButtonFont = new Font("Arial", 10F);
Pen ButtonBorderColor = new Pen(Color.Black);
Brush ButtonTextColor = new SolidBrush(Color.Black);
Генерация изображения:
Bitmap ControlImage = new Bitmap(GraphicWidth, GraphicHeight);
using (Graphics g = Graphics.FromImage(ControlImage))
{
g.Clear(Color.White);
for (int x = 0; x < GraphicWidth; x += ButtonWidth)
for (int y = 0; y < GraphicHeight; y += ButtonHeight)
{
g.DrawRectangle(ButtonBorderColor, x, y, ButtonWidth, ButtonHeight);
string ButtonLabel = ((GraphicWidth / ButtonWidth) * (y / ButtonHeight) + x / ButtonWidth).ToString();
SizeF ButtonLabelSize = g.MeasureString(ButtonLabel, ButtonFont);
g.DrawString(ButtonLabel, ButtonFont, ButtonTextColor, x + (ButtonWidth/2) - (ButtonLabelSize.Width / 2), y + (ButtonHeight/2)-(ButtonLabelSize.Height / 2));
}
}
pictureBox1.Image = ControlImage;
И в ответ на Click
событие pictureBox:
// Determine which "button" was clicked
MouseEventArgs em = (MouseEventArgs)e;
Point ClickLocation = new Point(em.X, em.Y);
int ButtonNumber = (GraphicWidth / ButtonWidth) * (ClickLocation.Y / ButtonHeight) + (ClickLocation.X / ButtonWidth);
MessageBox.Show(ButtonNumber.ToString());