Динамическое размещения контролов в Winforms

Иногда бывает необходимо размещать на форме контролы, число которых заранее неизвестно. Например, динамически помещать на форму объекты типа TextBox.

Для этого в классе, содержащем методы загрузки данных, объявляются массивы объектов нужного типа:
public partial class NewXML : Form 
{
   TextBox[] tbName = new TextBox[100];
   TextBox[] tbValue = new TextBox[100]; 
    ...
}

При ручном создании нужного количества полей ввода в теле метода, вызываемого,например,при нажатии кнопки button1, создается пара объектов, используя оператор new:
tbName[h] = new TextBox();
tbValue[h] = new TextBox();

Для удобства использования большого количества динамически созданных объектов их необходимо поместить на некоторый визуальный элемент с возможностью прокрутки,например, panel. Для этого после создания полей ввода задаем в качестве родительского элемента объект panel1, используя свойство Parent:
tbName[h].Parent = panel1;
tbValue[h].Parent = panel1;

Место размещения объектов на панели задаем свойствами Left и Top.Для того,чтобы можно было прокручивать область с полями ввода, нужно установить значение свойства AutoScroll элемента panel1 равным True, и при необходимости перевести фокус на эту область:
panel1.Focus();

Автоматическая прокрутка обеспечивается вызовом метода ScrollControlIntoView, в котором указывается тот контрол, который должен быть виден в области прокрутки в настоящий момент. Например:
panel1.ScrollControlIntoView(tbValue[NumberOfFields]);

Особенностью динамического создания объектов является необходимость подключать обработчик события с использованием кода-делегата для реализации возможности обработки событий. Например, если требуется использовать событие "изменения текста" в поле ввода,необходимо сначала написать соответствующий обработчик, а затем при создании объекта подписаться на него:
tbName[NumberOfFields] = new TextBox();
tbName[NumberOfFields].TextChanged += new EventHandler(this.tbNameChanged);
где tbNameChanged:
void tbNameChanged(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    ...
}
--
автор: Кувыкин Александр

Last edited Jan 19, 2012 at 9:56 AM by basph, version 5

Comments

No comments yet.