ti-enxame.com

Como criar muitos rótulos e caixas de texto dinamicamente, dependendo do valor de uma variável inteira?

Existe alguma maneira de criar dinamicamente e exibir 'n' Labels com 'n' Textboxs correspondentes quando sabemos o valor de 'n' após, por exemplo, clicar no botão "Display".

Deixe-me saber se alguma coisa faz você não entender a minha pergunta. Obrigado!

Eu estou trabalhando com o VS C # Express 2010 Windows Form.

10
Ronaldinho Learn Coding

Gostaria de criar um controle de usuário que contém um rótulo e uma caixa de texto e simplesmente criar instâncias desse controle de usuário 'n' vezes. Se você quiser saber uma maneira melhor de fazer isso e usar propriedades para obter acesso aos valores de Rótulo e Caixa de Texto do controle de usuário, informe-nos.

Uma maneira simples de fazer isso seria:

int n = 4; // Or whatever value - n has to be global so that the event handler can access it

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

    for (int i = 0; i < n; i++)
    {
        textBoxes[i] = new TextBox();
        // Here you can modify the value of the textbox which is at textBoxes[i]

        labels[i] = new Label();
        // Here you can modify the value of the label which is at labels[i]
    }

    // This adds the controls to the form (you will need to specify thier co-ordinates etc. first)
    for (int i = 0; i < n; i++)
    {
        this.Controls.Add(textBoxes[i]);
        this.Controls.Add(labels[i]);
    }
}

O código acima assume que você tem um botão btnDisplay e tem um evento onClick atribuído ao manipulador de eventos btnDisplay_Click. Você também precisa saber o valor de n e precisar de uma maneira de descobrir onde colocar todos os controles. Os controles devem ter largura e altura especificadas também.

Para fazer isso usando um controle de usuário, simplesmente faça isso.

Em primeiro lugar, vá e crie um novo controle de usuário e coloque uma caixa de texto e um rótulo nele.

Vamos dizer que eles são chamados txtSomeTextBox e lblSomeLabel. No código por trás adicione este código: 

public string GetTextBoxValue() 
{ 
    return this.txtSomeTextBox.Text; 
} 

public string GetLabelValue() 
{ 
    return this.lblSomeLabel.Text; 
} 

public void SetTextBoxValue(string newText) 
{ 
    this.txtSomeTextBox.Text = newText; 
} 

public void SetLabelValue(string newText) 
{ 
    this.lblSomeLabel.Text = newText; 
}

Agora o código para gerar o controle de usuário será semelhante a este (MyUserControl é o nome que você deu ao seu controle de usuário):

private void btnDisplay_Click(object sender, EventArgs e)
{
    MyUserControl[] controls = new MyUserControl[n];

    for (int i = 0; i < n; i++)
    {
        controls[i] = new MyUserControl();

        controls[i].setTextBoxValue("some value to display in text");
        controls[i].setLabelValue("some value to display in label");
        // Now if you write controls[i].getTextBoxValue() it will return "some value to display in text" and controls[i].getLabelValue() will return "some value to display in label". These value will also be displayed in the user control.
    }

    // This adds the controls to the form (you will need to specify thier co-ordinates etc. first)
    for (int i = 0; i < n; i++)
    {
        this.Controls.Add(controls[i]);
    }
}

Claro que você pode criar mais métodos no usercontrol para acessar as propriedades e defini-las. Ou simplesmente se você tiver que acessar muito, basta colocar essas duas variáveis ​​e acessar a caixa de texto e rotular diretamente:

public TextBox myTextBox;
public Label myLabel;

No construtor do controle de usuário, faça isso:

myTextBox = this.txtSomeTextBox;
myLabel = this.lblSomeLabel;

Então, no seu programa, se você quiser modificar o valor do texto, faça isso.

control[i].myTextBox.Text = "some random text"; // Same applies to myLabel

Espero que tenha ajudado :)

22
Daniel Wardin

Aqui está um exemplo simples que deve permitir que você continue adicionando algo que funcionaria como um espaço reservado para sua forma de compra pode ser TableLayoutPanel

e depois adicionar controles a ele 

   for ( int i = 0; i < COUNT; i++ ) {


    Label lblTitle = new Label();
    lblTitle.Text = i+"Your Text";
    youlayOut.Controls.Add( lblTitle, 0, i );

    TextBox txtValue = new TextBox();
    youlayOut.Controls.Add( txtValue, 2, i );
}
4
COLD TOLD

Suponha que você tenha um botão que quando pressionado definir n para 5, você poderá gerar rótulos e caixas de texto em seu formulário como tal.

var n = 5;
for (int i = 0; i < n; i++)
{
    //Create label
    Label label = new Label();
    label.Text = String.Format("Label {0}", i);
    //Position label on screen
    label.Left = 10;
    label.Top = (i + 1) * 20;
    //Create textbox
    TextBox textBox = new TextBox();
    //Position textbox on screen
    textBox.Left = 120;
    textBox.Top = (i + 1) * 20;
    //Add controls to form
    this.Controls.Add(label);
    this.Controls.Add(textBox);
}

Isso não apenas os adicionará ao formulário, mas os posicionará decentemente também.

2
Martin McGirk

Você pode tentar isto:

int cleft = 1;
intaleft = 1;
private void button2_Click(object sender, EventArgs e) 
{
     TextBox txt = new TextBox();
     this.Controls.Add(txt);
     txt.Top = cleft * 40;
     txt.Size = new Size(200, 16);
     txt.Left = 150;
     cleft = cleft + 1;
     Label lbl = new Label();
     this.Controls.Add(lbl);
     lbl.Top = aleft * 40;
     lbl.Size = new Size(100, 16);
     lbl.ForeColor = Color.Blue;
     lbl.Text = "BoxNo/CardNo";
     lbl.Left = 70;
     aleft = aleft + 1;
     return;
}
private void btd_Click(object sender, EventArgs e)
{ 
    //Here you Delete Text Box One By One(int ix for Text Box)
    for (int ix = this.Controls.Count - 2; ix >= 0; ix--)
    //Here you Delete Lable One By One(int ix for Lable)
    for (int x = this.Controls.Count - 2; x >= 0; x--)
    {
        if (this.Controls[ix] is TextBox) 
        this.Controls[ix].Dispose();
        if (this.Controls[x] is Label) 
        this.Controls[x].Dispose();
        return;
    }
}
0
Syed Nasir Mujtaba