come trasferire il testo dal controllo utente generato dynamicmente a una casella di testo

Ho un modulo di Windows in cui un pulsante1 quando viene cliccato un usercontrol viene aggiunto dynamicmente il codice è questo

int c = 0; private void button1_Click(object sender, EventArgs e) { int v; v = c++; panel1.VerticalScroll.Value = VerticalScroll.Minimum; UserControl1 us = new UserControl1(); us.Name = "us" + v; us.Location = new Point(50, 5 + (30 * v)); us.Tag = btn; panel1.Controls.Add(us); } 

che usercontrol contiene 4 controlli 2 combobox e 2 textbox

vale a dire combobox1 combobox2 textbox1 textbox2

ci sono 4 caselle di testo che sono sullo stesso modulo che è

ancora-textbox1, still-textbox2, still-textbox3, still-textbox4

un altro bottone2 è lì trasferirà il testo alle caselle combinate e alle caselle di testo che è oldcombobox1 oldcombobox2 oldtextbox1 old textbox2

quando button1 è cliccato due volte aggiungerà due usercontrol nella forma in cui voglio trasferire il testo in questo formato

oldcombobox1.text = still-textbox1.text + “,” + combobox1.text (che viene generato dynamicmente) + “,” + combobox1.text (che viene generato dynamicmente) ecc. tutto il combobox1 dal controllo utente che viene aggiunto dynamicmente)

oldcombobox2.text = still-textbox2.text + “,” + combobox2.text (che viene generato dynamicmente) + “,” + combobox2.text (che viene generato dynamicmente) ecc. tutto il combobox2 dal controllo utente che viene aggiunto dynamicmente)

oldtextbox1.text = still-textbox3 + “,” + textboox1.text (che viene generato dynamicmente) + “,” + textbox1.text (che viene generato dynamicmente) ecc. tutto il textbox1 dal controllo utente che viene aggiunto dynamicmente)

significa quando ancora still-textbox1.text = per prima cosa e quando viene aggiunto un usercontrol dinamico tre volte combobox1 quindi

il oldcombobox1 dovrebbe contenere

fisrt, combobox1.text, combobox1.text, combobox1.text

ho fatto questo codice ma non funziona

  foreach (Control ctrl in panel1.Controls) { if (ctrl is UserControl) { UserControl1 myCrl = ctrl as UserControl1; oldcombobox1.text = still-textbox1.text + "," + myCrl.comboBox1.Text; oldcombobox2.Text =still-textbox2.text + "," + myCrl.comboBox2.Text; oldtextbox1.Text = still-textbox3.text + "," + myCrl.textBox1.Text; oldtextbox2.Text.Text = still-textbox4.text + "," + myCrl.textBox2.Text; } } 

Dovresti aggiungere alla tua class UserControl1 (ottimo nome btw ;-)) qualcosa come questo per ogni stringa a cui vuoi accedere da un altro object, in questo caso la stringa di textBox1 :

 public String FirstTextBoxText { get { return this.textBox1.Text; } } 

Quindi puoi dire nella class Form:

  if (ctrl is UserControl) { UserControl1 myCrl = ctrl as UserControl1; // ... oldtextbox1.Text = still-textbox3.text + "," + myCrl.FirstTextBoxText; } 

È ancora un codice orribile, ma funzionerà.

Lo farei con gli eventi.

Crea una class che eredita da EventArgs: (preferisco VB, puoi traslare)

 Public Class ControlEventArgs Inherits EventArgs Public Property Value1 As String = String.Empty Public Property Value2 As String = String.Empty Public Property Value3 As String = String.Empty Public Property Value4 As String = String.Empty End Class 

Quindi nel tuo controllo aggiungi l’evento:

 Public Event ValueSubmittal As EventHandler(Of ControlEventArgs) 

Nel tuo gestore Button2_Click:

 RaiseEvent ValueSubmittal(me, new ControlEventArgs With {.Value1=comboBox1.Text, .Value2 = comboBox2.Text, .Value3 = textBox1.Text, .Value4 = textBox2.Text} 

E nella tua forma in cui crei dynamicmente i controlli devi colbind il gestore di eventi:

 AddHandler myNewControl.ValueSubmittal, AddressOf ValueSubmittalHandler 

E il ValueSubmittalHandler:

 Private Sub ValueSubmittalHandler(sender as Object, e As ControlEventArgs) formControl1.Text = e.Value1 formControl2.Text = e.Value2 ' etc... End Sub 

Puoi creare una variabile di livello di class:

  private UserControl1 us1; private UserControl1 us2; private void button1_Click(object sender, EventArgs e) { int v; v = c++; panel1.VerticalScroll.Value = VerticalScroll.Minimum; if(us == null) { //this is the first time the control is created us1 = new UserControl1(); us1.Name = "us" + v; us1.Location = new Point(50, 5 + (30 * v)); us1.Tag = btn; panel1.Controls.Add(us1); } else if(us2 ==null) { us2 = new UserControl1(); //whatever code you want to execute to change second one //you can access first control as us1.xxx panel1.Controls.Add(us2); } else { //3rd 4th etc... } }