2013-02-21 10 views
7

Czy istnieje sposób dynamicznego tworzenia i wyświetlania etykiet "n" z odpowiednimi polami tekstowymi "n", gdy znamy wartość "n" po kliknięciu na przykład przycisku "Wyświetl".Jak dynamicznie tworzyć wiele etykiet i pól tekstowych w zależności od wartości zmiennej liczb całkowitych?

Daj mi znać, jeśli coś sprawi, że nie zrozumiesz mojego pytania. Dziękuję Ci!

Pracuję z formularzem Windows VS C# Express 2010.

+2

pisownię jest niesamowity twórczy. –

+1

możliwe duplikat [Dynamicznie utworzyć tablicę tekstowych i etykiety WinForm] (http://stackoverflow.com/questions/11157369/dynamically-create-array-of-textboxes-and-labels-winforms) – mbeckish

+2

@UweKeim mój zły ENG, ale myślę, że było naprawdę niesamowicie kreatywne LOL –

Odpowiedz

15

Utworzę formant użytkownika, który będzie zawierał etykietę i pole tekstowe, i po prostu utworzy instancje tej kontrolki użytkownika "n" razy. Jeśli chcesz wiedzieć, jak to zrobić i użyć właściwości, aby uzyskać dostęp do wartości Etykieta i Pole tekstowe z poziomu kontroli użytkownika, proszę dać mi znać.

prosty sposób zrobić to byłoby:

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

Powyższy kod zakłada, że ​​masz przycisk btnDisplay i ma onClick zdarzenia przypisanego do btnDisplay_Click obsługi zdarzeń. Musisz także znać wartość n i potrzebować sposobu na ustalenie, gdzie umieścić wszystkie elementy sterujące. Kontrolki powinny również mieć określoną szerokość i wysokość.

Aby to zrobić za pomocą Kontroli użytkownika, wystarczy to zrobić.

Dobra, najpierw idź i utwórz nową kontrolę użytkownika i umieść w niej pole tekstowe i etykietę.

Powiedzmy, że są nazywane txtSomeTextBox i lblSomeLabel. W kodzie za dodać ten kod:

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

teraz kod do generowania kontrolę użytkownika będzie wyglądać następująco (MyUserControl to nazwa trzeba dać kontrolą użytkownika):

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

Oczywiście możesz utworzyć więcej metod w sterowaniu użytkownika, aby uzyskać dostęp do właściwości i je ustawić. Albo po prostu, jeśli masz dostęp do dużo, wystarczy umieścić w tych dwóch zmiennych i można uzyskać dostęp do pola tekstowego i etykiety bezpośrednio:

public TextBox myTextBox; 
public Label myLabel; 

W konstruktorze kontroli użytkownika to zrobić:

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

Następnie w programie, jeśli chcesz zmodyfikować wartość tekstową, po prostu zrób to.

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

Nadzieję, że pomogło :)

PS. Oto link do przykładowego projektu, jeśli.

Dynamic Control Creation

+0

Cześć, tak chcę, aby uzyskać dostęp wartość Label i TextBox, mógłbyś doradzić? –

+0

Jeśli możesz dołączyć swoją odpowiedź z nowymi kodami przykładowymi, które są wspaniałe, ponieważ czasami mogę myśleć w różny sposób. –

+1

tutaj idziesz kolego, jeśli trzeba to jaśniejsze lub niektóre rzeczywiste próbki projekt, proszę dać mi znać –

4

Oto prosty przykład, który powinien pozwolić ci zachować zamiar dodać somethink że będzie działać jako zastępczy do swojej winform może być TableLayoutPanel

a potem po prostu dodać formanty do niego

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

ta odpowiedź jest semi-dynamiczny – YEH

2

Załóżmy, że masz przycisk, który po naciśnięciu ustawia n na 5, mógłbyś następnie wygenerować etykiety i pola tekstowe w swoim formularzu, tak jak to.

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

To nie tylko doda je do formularza, ale także przyzwoicie je ustawi.

0

Można spróbować to:

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; 
    } 
} 
Powiązane problemy