web-dev-qa-db-fra.com

Comment créer de nombreuses étiquettes et zones de texte de manière dynamique en fonction de la valeur d'une variable entière?

Existe-t-il un moyen de créer et d'afficher dynamiquement des étiquettes "n" avec des zones de texte "n" correspondantes lorsque nous connaissons la valeur de "n" après, par exemple en cliquant sur le bouton "Afficher".

Faites-moi savoir si quelque chose vous empêche de comprendre ma question. Je vous remercie!

Je travaille avec le formulaire Windows VS C # Express 2010.

10

Je créerais un contrôle utilisateur qui contiendrait une étiquette et une zone de texte et créerais simplement des instances de ce contrôle utilisateur plusieurs fois. Si vous souhaitez connaître un meilleur moyen de le faire et utiliser des propriétés pour accéder aux valeurs de Label et Zone de texte à partir du contrôle utilisateur, veuillez me le faire savoir.

Un moyen simple de le faire serait:

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]);
    }
}

Le code ci-dessus suppose que vous avez un bouton btnDisplay et que l'événement onClick est attribué au gestionnaire d'événements btnDisplay_Click. Vous devez également connaître la valeur de n et trouver un moyen de déterminer où placer tous les contrôles. Les contrôles doivent avoir une largeur et une hauteur spécifiées.

Pour ce faire, utilisez simplement un contrôle utilisateur.

D'accord, commencez par créer un nouveau contrôle utilisateur et placez-y une zone de texte et une étiquette.

Disons qu'ils s'appellent txtSomeTextBox et lblSomeLabel. Dans le code derrière ajoutez ce code: 

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; 
}

Maintenant, le code pour générer le contrôle utilisateur ressemblera à ceci (MyUserControl est le nom que vous avez donné à votre contrôle utilisateur):

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]);
    }
}

Bien sûr, vous pouvez créer davantage de méthodes dans le contrôle utilisateur pour accéder aux propriétés et les définir. Ou simplement si vous devez accéder à un lot, insérez simplement ces deux variables et accédez directement à la zone de texte et à l'étiquette:

public TextBox myTextBox;
public Label myLabel;

Dans le constructeur du contrôle utilisateur, procédez comme suit:

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

Ensuite, dans votre programme, si vous souhaitez modifier la valeur du texte, faites-le simplement.

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

J'espère que ça a aidé :)

22
Daniel Wardin

Voici un exemple simple qui devrait vous permettre de continuer à ajouter quelque chose qui agirait comme un espace réservé dans votre winform peut être TableLayoutPanel

et puis juste ajouter des contrôles à ce 

   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

Supposons que vous ayez un bouton qui vous permet de générer des étiquettes et des zones de texte sur votre formulaire lorsque vous appuyez sur n 5.

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);
}

Cela les ajoutera non seulement à la forme mais les positionnera également de manière décente.

2
Martin McGirk

Vous pouvez essayer ceci:

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