Re: Динамическое добавление контролов
От: lambdafunction Удмуртия http://lambdafunction.moikrug.ru/
Дата: 19.07.07 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток.

А>Передо мной стоит задача следующего типа. Есть у меня пустая форма (с кнопкой). мы получаем массив строк(из XML) и для каждого элемента массива должны отрисовать контрол, типа TextBox.
А>Как сделать это.
А>Пробовал следующим образом:

А>
А>for (int i = 1; i <= xp.getRootElement(textBox1.Text).Length; i++) {
А>    int o = 1;
А>    int y = 30;
А>        TextBox ab = new TextBox();
А>    this.Controls.Add(ab);
А>    ab.Location = new System.Drawing.Point(10, y);
А>    ab.Name = xp.getRootElement(textBox1.Text)[o];
А>    ab.Text = xp.getRootElement(textBox1.Text)[o];
А>    ab.Size = new System.Drawing.Size(360, 20);
А>    ab.TabIndex = 4;
А>    o++;
А>    y+=30;
А>}
А>

А>выводит только один TextBox.

А>Может я чего не понимаю?


Может быть, конечно, все не так, как мне кажется (и просто обязано быть), но здесь
      TextBox ab = new TextBox();

присутствует один и тот же объект класса. То есть, он каждую итерацию заново удаляется, создается и позиционируется куда надо. Вслепую предположу, что проблема может разрешиться, если код чуть поправить:

int o = 1;
int y = 30;
TextBox[] ab = new TextBox()[xp.getRootElement(textBox1.Text).Length];

for (int i = 0; i < xp.getRootElement(textBox1.Text).Length; i++) {
    this.Controls.Add(ab[i]);
    ab[i].Location = new System.Drawing.Point(10, y);
    ab[i].Name = xp.getRootElement(textBox1.Text)[o];
    ab[i].Text = xp.getRootElement(textBox1.Text)[o];
    ab[i].Size = new System.Drawing.Size(360, 20);
    ab[i].TabIndex = 4;
    ++o;
    y += 30;
}

И еще. Расстояния между текстбоксами в 10px — это ужастик, как мне кажется. Microsoft рекомендует (и не зря) оставлять 7px между текстбоксами высотой по 24px.
--
jabber: lambdafunction@jabber.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.