2014-02-07 3 views
4

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

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

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

     int n = 4; 

     private void btnDisplay_Click(object sender, EventArgs e) 
     { 
      TextBox[] textBox = new TextBox[n]; 
      Label[] label = new Label[n]; 

      for (int i = 0; i < n; i++) 
      { 
       textBox[i] = new TextBox(); 
       textBox[i].Name = "n" + i; 
       textBox[i].Text = "n" + i; 

       label[i] = new Label(); 
       label[i].Name = "n" + i; 
       label[i].Text = "n" + i; 
      } 

      for (int i = 0; i < n; i++) 
      { 
       this.Controls.Add(textBox[i]); 
       this.Controls.Add(label[i]); 
      } 
     } 
    } 
} 
+0

Это похоже на работу ретранслятора. Не могли бы вы использовать общий список своих элементов управления и привязать его к ретранслятору? – Tim

+0

вероятный дубликат по http://stackoverflow.com/questions/9368748/dynamically-create-multiple-textboxes-c-sharp – DoIt

+0

Пожалуйста, предоставьте более подробное описание проблемы, чем «ничего не делает». –

ответ

7

Вы добавляете все элементы управления друг на друга, поэтому, похоже, есть только один из них. Вы хотите поместить их в какой-то элемент управления/панель управления на основе макета (например, FlowLayoutPanel), который автоматически разместит структуры в соответствующем месте в зависимости от типа макета, который вы хотите.

0

Запрос на создание массива инициализирует элементы только нулевым. Вам необходимо индивидуально их создать. Try This

TextBox[] txtTeamNames = new TextBox[teams]; 
for (int i = 0; i < txtTeamNames.Length; i++) { 
    var txt = new TextBox(); 
    txtTeamNames[i] = txt; 
    txt.Name = name; 
    txt.Text = name; 
    txt.Location = new Point(172, 32 + (i * 28)); 
    txt.Visible = true; 
} 
+1

Вы почти наверняка не хотите вручную указывать местоположение. Это приводит к формам, которые не могут обрабатывать элементы управления динамическим размером (что необычно распространено), не могут быть изменены и т. Д. Это также * много * работы, чтобы попытаться выровнять все правильно, даже если все статично по своему размеру , Вы почти наверняка хотите использовать какой-то менеджер компоновки. – Servy

0

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

pnl1.Controls.Add(textBox[i]); 
pnl1.Controls.Add(label[i]); 
1

Я просто написал быстрый C# проект в моей визуальной студии. Код ниже добавляет новое текстовое поле в форму.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     TextBox txtBox; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      txtBox = new TextBox(); 
      txtBox.Location = new Point(10, 50); 
      txtBox.Visible = true; 
      Controls.Add(txtBox); 
     } 
    } 
} 

------------------------------------------ ДОБАВЛЕНО -------------------------------------

Код ниже, добавит 4 текстовых поля и 4 ярлыка, как вы этого хотите. Вы можете увидеть изображение (в конце кода), как оно показано на моем примере.

P.s .: Вам нужно будет правильно настроить положение.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     TextBox[] txtBox; 
     Label[] lbl; 

     int n = 4; 
     int space = 20; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      txtBox = new TextBox[n]; 
      lbl = new Label[n]; 

      for (int i = 0; i < n; i++) 
      { 
       txtBox[i] = new TextBox(); 
       txtBox[i].Name = "n" + i; 
       txtBox[i].Text = "n" + i; 

       lbl[i] = new Label(); 
       lbl[i].Name = "n" + i; 
       lbl[i].Text = "n" + i; 
      } 


      for (int i = 0; i < n; i++) 
      { 
       txtBox[i].Visible = true; 
       lbl[i].Visible = true; 
       txtBox[i].Location = new Point(40, 50 + space); 
       lbl[i].Location = new Point(10, 50 + space); 
       this.Controls.Add(txtBox[i]); 
       this.Controls.Add(lbl[i]); 
       space += 50; 
      } 

     } 
    } 
} 

Скриншот: http://shrani.si/f/1F/Y/22BgTuBX/example.png

Я также нашел время и загрузил проект я сделал для SendSpace.

Ссылка для скачивания: http://www.sendspace.com/file/glc7h2

+0

Но он не добавляет 4 текстовых поля и 4 метки. Попробуйте запустить код OP, чтобы увидеть, где находится его проблема. – Servy

+0

Вы правы. Поэтому я создал новый проект, содержащий решение, которое он ищет. По крайней мере, я надеюсь, что это то, что он ищет! :) – MiKE

+0

Вы почти наверняка не хотите вручную указывать местоположение. Это приводит к формам, которые не могут обрабатывать элементы управления динамическим размером (что необычно распространено), не могут быть изменены и т. Д. Также очень сложно попытаться правильно выровнять все, даже если все статично по размеру. Вы почти наверняка хотите использовать какой-то менеджер компоновки. – Servy

1

Textboxes и этикетки помещаются поверх друг друга, так как вы не указали место для них.

Изменить код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

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

     int n = 4; 

     private void btnDisplay_Click(object sender, EventArgs e) 
     { 
      TextBox[] textBox = new TextBox[n]; 
      Label[] label = new Label[n]; 
      int labelX, labelY, textboxX, textboxY; 

      labelX = 20; 
      labelY = 20; 
      textboxX = 50; 
      textboxY = 20; 

      for (int i = 0; i < n; i++) 
      { 
       textBox[i] = new TextBox(); 
       textBox[i].Name = "n" + i; 
       textBox[i].Text = "n" + i; 
       textBox[i].Location = new Point(textboxX, textboxY); 

       label[i] = new Label(); 
       label[i].Name = "n" + i; 
       label[i].Text = "n" + i; 
       label[i].Location = new Point(labelX, labelY); 

       labelY += 25; 
       textboxY += 25; 
      } 

      for (int i = 0; i < n; i++) 
      { 
       this.Controls.Add(textBox[i]); 
       this.Controls.Add(label[i]); 
      } 
     } 
    } 
} 

Textboxes и этикетки будут отображаться в 2 колонки, добавляя 25 к значениям Y каждой строки.

+0

Вы почти наверняка не хотите вручную указывать местоположение. Это приводит к формам, которые не могут обрабатывать элементы управления динамическим размером (что необычно часто), не могут быть изменены и т. Д. Также много работы чтобы попытаться выровнять все правильно, даже если все статично по своему размеру. Вы почти наверняка хотите использовать какой-то менеджер компоновки. – Servy

+0

@Servy Я понимаю, но это ответ, чтобы решить конкретный вопрос пользователя, показывая ему, что пошло не так. Следующим шагом будет правильное выравнивание меток и текстовых полей, но это должно заботиться о себе. – Max

+0

Это ответ, который создает * много новых проблем в попытке решить предложенное. это подход для решения проблемы, о которой я утверждаю *, не должен использоваться вообще *. OP не должен * иметь *, чтобы идти самостоятельно, куча времени, пытаясь правильно выложить элементы управления.используйте одну из панелей макета, предназначенную для выкладки для него. Это будет * значительно * легче и * намного более эффективным. Такое решение никоим образом не требует когда-либо касания свойств «Местоположение». – Servy

0
namespace Sample 
{ 
    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     TextBox txbx = new TextBox(); 
     private void button1_Click(object sender, EventArgs e) 
     { 
      AddNewTextBox(); 

      txbx = new TextBox(); 

      txbx.Location = new Point(10, 20); 

      txbx.Visible = true; 

      Controls.Add(txbx); 

     } 

    } 
} 
+1

Не могли бы вы правильно отформатировать свой ответ? Благодаря!!! – Allan

+0

Это также работает ... Динамически создайте один новый элемент управления текстовым полем, .. –

Смежные вопросы