Reputation: 201
I am learning c#. I want to create some controls dynamically. Here is the code that I am trying to create new elements on form dynamically, but it doesn't do anything. Please help me to solve this problem.
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]);
}
}
}
}
Upvotes: 9
Views: 38342
Reputation: 1
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);
}
}
}
Upvotes: 0
Reputation: 13328
The Textboxes and Labels are placed on top of each other, since you didn't specify a location for them.
Change your code to:
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 and Labels will be shown in 2 columns, adding 25 to their Y values every row.
Upvotes: 1
Reputation: 524
I just wrote a fast C# project in my visual studio. The code below adds a new textbox to the form.
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);
}
}
}
------------------------------------------ADDED-------------------------------------
The code below, will add 4 textboxes and 4 labels, like you want it. You can see the picture(at the end of the code), how it shows on my example.
P.s.: You will need to configure the position properly though.
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;
}
}
}
}
Screenshot: http://shrani.si/f/1F/Y/22BgTuBX/example.png
I also took the time and uploaded the project i made to Sendspace.
Download link: http://www.sendspace.com/file/glc7h2
Upvotes: 7
Reputation: 203802
You're adding all of the controls on top of each other, which is why it looks like there is only one of them. You'll want to put them in some sort of layout based control/panel (such as a FlowLayoutPanel
) that will automatically place the structures in the appropriate location based on the type of layout that you want.
Upvotes: 11
Reputation: 2898
Yes first define where you want to add the control in the page and add the control on that main control. Example page have one panel and it’s name is pnl1 so use like below
pnl1.Controls.Add(textBox[i]);
pnl1.Controls.Add(label[i]);
Upvotes: 1
Reputation: 3428
The array creation call just initializes the elements to null. You need to individually create them. 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;
}
Upvotes: 0