Mam prosty formularz systemu Windows do uzyskania danych użytkownika. Jeśli użytkownik chce dodać alternatywny numer telefonu komórkowego, klikając przycisk "+", pojawi się pole tekstowe poniżej i inne pola tekstowe powinny ustawić się zgodnie z nowo dodaną skrzynką tekstową. Jestem w stanie dynamicznie dodać pole tekstowe w czasie wykonywania, ale nie jest w stanie ponownie położyć innej komponentu formularza w odniesieniu do dynamicznie dodanego pola tekstowego. Poniżej znajduje się mój kod i wyznaczanie migawki. Z góry dziękuję.

private void button1_Click(object sender, EventArgs e)
{
    TextBox txtRun = new TextBox();
    txtRun.Name = "txtDynamic" + c++;
    txtRun.Location = new System.Drawing.Point(90, 74 + (20 * c));
    txtRun.Size = new System.Drawing.Size(200, 25);
    txtRun.Location.X = 90;
    txtRun.Location.Y = 74;
    this.Controls.Add(txtRun);
}

User details windows form

0
Sameer Betageri 17 luty 2017, 10:01

3 odpowiedzi

Najlepsza odpowiedź

Spróbuj tego,

int c = 0; // for uinque txtDynamic text creation 
private void button1_Click(object sender, EventArgs e)
{
      TextBox txtDynamic = this.Controls.Find("txtDynamic" + c, true)[0] as TextBox; // find lastly added txtDynamic 

      TextBox txtRun = new TextBox();
      txtRun.Name = "txtDynamic" + ++c;
      txtRun.Size = new System.Drawing.Size(100, 20);
      txtRun.Location = new Point(txtDynamic.Location.X, txtDynamic.Location.Y + 35); // X axis will be same y will increase with count 35


      foreach (Control item in this.Controls)
      {
           if (item.Location.Y >= txtRun.Location.Y){ // if there is an item that has greater Y location
               item.Location = new Point(item.Location.X, txtRun.Location.Y + 35); // It should increase its value as 35 too.
           }
           this.Controls.Add(txtRun);

      }
}

Edytuj 1:

Dobra, stworzyłem kontrolki za pomocą przeciągania i upuść, nie wiem, czy tworzyłeś je programowo. Przycisk + będzie dodać nowe pola tekstowe po textbox Mobil Textbox. Więc mobilny textbox, którego przeciągnąłem i odrzucam, będzie najlepszym punktem. Więc dałem to nazwisko jako " txtdynamic0 ",

enter image description here

Umieść punkt przerwania na button1_click, twoja zmienna {X1}} ma wartość innego niż 0 dla punktu wyjścia.

wynik; Wprowadź opis obrazu tutaj

Nadzieja pomaga,

0
Berkay 17 luty 2017, 08:34

Obiekt przechowywane wszystkie obiekty. Otrzymasz go także i dodasz swój TextBox w tym kodzie:

this.Controls.Add(txtRun);

Możesz zdecydować, jak radzą sobie sprawę, ponieważ istnieje więcej rozwiązań. Możesz przejść przez wszystkie elementy sterujące, znajdziesz poniżej MobileTextBox i przesuń je kilka pikseli w dół.

Możesz też grupować elementy sterujące poniżej MobileTextBox do niektórych GroupBox (lub inną kontrolę grupowania), a następnie przesuń GroupBox.

I / lub jest rozwiązaniem wspomnianym przez @GT - FlowLayoutPanel, który zajmie się układem w podobny sposób, gdy WPF framework robi.

Niektóre przykłady kodu:

private void button1_Click(object sender, EventArgs e)
{
    TextBox txtRun = new TextBox();
    txtRun.Name = "txtDynamic" + c++;
    txtRun.Location = new System.Drawing.Point(90, 74 + (20 * c));
    this.Controls.Add(txtRun);

    //removed some code for brevity


    //1st solution
    foreach(Control item in this.Controls)
    {
        //there can be some other condition
        //based on e.g. name of TB
        //or if the type is GroupBox with some name

        if(item.Location.Y >= txtRun.Location.Y)
           item.Location.Y = item.Location.Y + 25; 

    }

}
0
Tatranskymedved 17 luty 2017, 07:29