Announcement

Collapse
No announcement yet.

Dynamisches Erzeugen von Tabellenzeilen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamisches Erzeugen von Tabellenzeilen

    Hallo!
    Ich habe eine Tabelle mit einer Schaltfläche. Bei Betätigen der Schaltfläche sollen neue Zeilen in der Tabelle erstellt werden. Beim Erstellen wird eine Textbox eingefügt. Dadurch soll dem Nutzer ermöglicht werden dynamisch die benötigte Anzahl der Textfelder zu erzeugen. Dabei habe ich aber das Problem, dass immer nur ein Feld angefügt wird. Bei nochmaligem Klicken "löscht" er die Zeile und fügt sie wieder neu hinzu. Habe irgendwie das Gefühl, dass sie die Seite nicht "merkt", dass eine neue Tabellenzeile hinzugefügt wurde. Lange Rede kurzer Sinn, hier der Code:
    Code:
    private void addCell() {          
                Table myTable = meineTabelleDerWebsite;
    
                TableRow myRow = new TableRow();
    
                TableCell bezCell = new TableCell();
                bezCell.Text = "Bezeichnung";
    
                TableCell textCell = new TableCell();
                TextBox textBezeichner = new TextBox();
                textCell.Controls.Add(textBezeichner);
    
                TableCell removeCell = new TableCell();
                Button removeButton = new Button();
                removeButton.Text = "-";
                removeCell.Controls.Add(removeButton);
    
                TableCell[] cells = new TableCell[] { bezCell, textCell, removeCell };
    
                myRow.Cells.AddRange(cells);
                myTable.Rows.Add(myRow);
    }
    Ist der Ansatz richtig und wenn ja, wie kann ich es umsetzen, dass ich mehrere Zeilen dynamisch hinzufügen kann?

    Danke schonmal

  • #2
    hallo das Problem ist dein Postback, durch diesen vergisst er die einen postback vorher dynamisch erstellten Controls und auch deren Inhalte. Du musst dir die Werte merken und wieder erstellen. Das kannst du entweder machen in dem du in einem sehr frühen Event der Seite die dynamisch erstellten Controls erneut erstellst (stehen im Viewstate)

    oder du nutzt die delux-Variante aus dem Link, allerdings muss du da glaube ich erst mal schauen wie der das macht und ob das einfach zu implementieren ist.

    http://www.manitra.net/blog/dev/csha...amic-controls/

    Comment


    • #3
      Danke für die Antwort.
      Ich hatte bereits probiert, die TableRow Objekte in einer typisierten Liste innerhalb des Codebehinds abzulegen, aber selbst die ist jedes mal wieder leer. Brauche ich dazu eine eigene Klasse im App_Code-Ordner, welche die Objekte in der Liste speichert? Oder würde es auch funktionieren, wenn ich im Codebehind die Liste als static setze?

      EDIT:
      Also wenn ich die Liste als static deklariere funktioniert das Ganze, wenn ich am Ende die Liste dann durchlaufe und alle Elemente erneut hinzufüge
      Das Problem ist nun, wenn ich in eine Textboxe etwas hineinschreibe diese dann beim Hinzufügen einer neuen leer ist. Sicherlich liegt es daran, dass die Objekte in der Liste ebenfalls leer sind. Allerdings lege ich in der Liste nur die TableRow-Objekte ab.
      1. Kann ich die Liste "updaten", sprich den einzelnen Textbox-Objekten der TableRow-Objekte den entsprechenden Wert zuweisen?
      2. Kann ich überhaupt auf "Unterobjekte", in diesem Fall die Textboxen der TableRow, zugreifen?
      Zuletzt editiert von Nayko; 21.07.2011, 09:46.

      Comment


      • #4
        hallo
        mit folgendem Code kannst du auf alle Elemente zugreifen die dir gepostet wurden, egal ob normal hinzugefügtes Control oder dynamisch.

        Den Wert des dynamischen Controls musst du dir nur wieder wo hinschreiben um es erneut zu generieren bzw. abzuspeichern. Es macht da Sinn nach einem gewissen Schema zu arbeiten. Z.B. die Controls durchzunummerieren damit du sie auch wiederfindest und weisst wann keine mehr kommen.

        foreach (string ctrl in Page.Request.Form)

        postbackControl = Page.FindControl(ctrl);
        if (Request.Form[ctrl] != "")
        {
        if ((postbackControl is DropDownList) | (postbackControl is TextBox))
        {
        .....
        }
        }

        Comment


        • #5
          Ok das klappt soweit, jedoch habe ich ein neues Problem
          Vielleicht nochmal zu meinem Code:
          Ich habe eine Liste
          Code:
          private static List<TableRow> rows = new List<Tablerow>()
          Beim Hinzufügen wird eine neue Zeile erstellt. Der Zeile werden 2 Zellen (TableCell) hinzugefügt. Der einen Zelle wird eine TextBox und der anderen der Button hinzugefügt. Die Zeile mit zwei Zellen, Button und TextBox lege ich in der Liste rows ab. Am Ende durchlaufe ich meine Liste rows
          Code:
          foreach(TableRow thisRow in rows) 
          {
              meineTabelle.Rows.Add(thisRow);
          }
          Der erstellte Button dient dazu, um die entsprechende Zeile wieder löschen zu können.
          Dem Button weiße ich eine ID, einen EventHandler, ein CommandName (loescheZeile) und ein CommandArgument (Position der Zeile in der Tabelle). Leider passiert absolut nichts, wenn ich auf den Löschen-Button klicke Irgendwie wird der EventHandler nicht ausgelöst.
          Die Zuweisung dafür sollte eigentliche funktionieren:
          Code:
          removeButton.Command += New CommandEventHandler(buttonAction);
          Weißt du / ihr da weiter?


          EDIT:
          Ok jetzt wird es kurios. Wenn ich beim Page_Init meine Tabelle durchlaufe, sagt er mir dass dort bei Rows.Count keine Zeilen vorhanden sind, obwohl ich sie aber sehen kann! In meiner Liste "rows" sind die Zeilen aber nach wie vor enthalten...
          Auch mit deiner Methode, sprich alle Controls von Page.Request.Form wird es nichts. Er zeigt mir zwar als String eine Textbox an, aber finden kann er sie nicht
          Zuletzt editiert von Nayko; 21.07.2011, 12:11.

          Comment


          • #6
            ich vermute, es wäre besser ein mit der Datenbank gebundenen DataGrid zu verwenden und alles über die SQL-Statement, bzw. Datenbank-Tabelle zu steuern.
            Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

            Comment


            • #7
              Hallo!
              Also eine Datenbank macht in diesem Zusammenhang keinen Sinn.
              Die Seite soll ein Formular werden, um in eine DB schreiben zu können.
              Vorstellen kannst du dir das so:
              Ich wähle eine ID aus, der ich einen Begriff zuordnen möchte. Die ID holt er dabei aus der DB. Klicke ich auf das Plus wird eine neue Zeile erzeugt, mit der ich der entsprechenden ID einen Begriff zuordnen kann.
              Klicke ich abschließend auf "Eintragen" so werden alle Zeilen der Tabelle durchlaufen und deren Werte in die DB geschrieben.

              Comment


              • #8
                meiner Meinung nach: FormView + GridView, aber das ist nur meine (subjektive) Meinung :-)
                Zuletzt editiert von vadym voytas; 25.07.2011, 22:49.
                Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

                Comment

                Working...
                X