2016-03-28 10 views
0

Hallo an alle und vielen Dank im Voraus,Wie bewahren die Werte Zugriff auf dynamische Steuerungen

Ich habe mehrere Threads über gelesen, aber ich bin sehr verwirrt. Die Sache ist, ich bin zu schaffen dynamisch einige Textfelder in einem Panel-Steuerelement, die in einem Formview whith diesem Code platziert ...

protected void Muestra_Precio_Stock_BT_Click(object sender, EventArgs e) 
    { 
     CheckBoxList FormatosCL = (CheckBoxList)FormViewDiscos.FindControl("FormatosCL"); 
     Panel Precio_Stock_PN = (Panel)FormViewDiscos.FindControl("CB_Precio_Stock_PN"); 

     Label NuevoPrecioLB = null; 
     TextBox NuevoPrecioTB = null; 
     Label NuevoStockLB = null; 
     TextBox NuevoStockTB = null; 

     foreach (ListItem item in FormatosCL.Items) 
     { 
      if(item.Selected) 
      { 
       NuevoPrecioLB = new Label(); 
       NuevoPrecioTB = new TextBox(); 
       NuevoStockLB = new Label(); 
       NuevoStockTB = new TextBox(); 

       NuevoPrecioLB.ID = "NuevoPrecioLB_" + FormatosCL.Items.IndexOf(item); 
       NuevoPrecioLB.Text = "PRECIO " + item.Text + ": "; 
       NuevoPrecioTB.ID = "NuevoPrecioTB_" + FormatosCL.Items.IndexOf(item); 

       NuevoStockLB.ID = "NuevoStockLB_" + FormatosCL.Items.IndexOf(item); 
       NuevoStockLB.Text = " STOCK " + item.Text + ": "; 
       NuevoStockTB.ID = "NuevoStockTB_" + FormatosCL.Items.IndexOf(item); 

       Precio_Stock_PN.Controls.Add(NuevoPrecioLB); 
       Precio_Stock_PN.Controls.Add(NuevoPrecioTB); 
       Precio_Stock_PN.Controls.Add(NuevoStockLB); 
       Precio_Stock_PN.Controls.Add(NuevoStockTB); 

       Precio_Stock_PN.Controls.Add(new LiteralControl("<br />")); 
      } 
     } 
    } 

Nun, das funktioniert gut, wenn ich das Projekt die Textfelder und Etiketten laufen erstellt werden Wie erwartet, kann ich sie sehen und in die Textfelder schreiben. Ich habe denselben Code in das Page_Load -Ereignis eingefügt und jetzt kann ich die erstellten Steuerelemente abrufen und die Null-Null-Erkennung vermeiden (das war mein erstes Problem), wenn ich auf die INSERT-Schaltfläche der Formularansicht klicke. Das Problem ist, dass in dem folgenden Code ...

protected void InsertButton_Click(object sender, EventArgs e) 
    { 
     TextBox DiscIdTB = (TextBox)FormViewDiscos.FindControl("DiscIdTB"); 
     TextBox CaratulaTB = (TextBox)FormViewDiscos.FindControl("CaratulaTB"); 
     CheckBoxList CancionesCL = (CheckBoxList)FormViewDiscos.FindControl("CancionesCL"); 
     CheckBoxList FormatosCL = (CheckBoxList)FormViewDiscos.FindControl("FormatosCL"); 

     using (SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBBDD-Discos"].ConnectionString)) 
     { 
      conexion.Open(); 

      cmd.Connection = conexion; 

      cmd.CommandText = "INSERT INTO DISCOS_FORMATOS (ID_DISCO, ID_FORMATO, PRECIO, STOCK) VALUES ((SELECT MAX(ID_DISCO) FROM DISCOS), @IdFormato, 0, 0)"; 

      foreach (ListItem item in FormatosCL.Items) 
      { 
       if (item.Selected) 
       { 
        Panel Precio_Stock_PN = (Panel)FormViewDiscos.FindControl("CB_Precio_Stock_PN"); 

        string control = "NuevoPrecioTB_" + (FormatosCL.Items.IndexOf(item)); 
        string control2 = "NuevoStockTB_" + (FormatosCL.Items.IndexOf(item)); 

        TextBox Precio = (TextBox)Precio_Stock_PN.FindControl(control); 
        TextBox Stock = (TextBox)Precio_Stock_PN.FindControl(control2); 

        cmd.Parameters.Clear(); 
        cmd.Parameters.AddWithValue("@IdFormato", item.Value); 
        cmd.Parameters.AddWithValue("@IdPrecio", Convert.ToInt32(Precio.Text)); 
        cmd.Parameters.AddWithValue("@IdStock", Convert.ToInt32(Stock.Text)); 

        cmd.ExecuteNonQuery(); 

       } 

      } 

      conexion.Close(); 
      cmd.Dispose(); 
     } 

    } 

, wenn die Ausführung dieser Zeilen erreicht, dynamisch erstellte Textfelder ihre Werte verloren, Rückkehr immer 0 ...

 cmd.Parameters.AddWithValue("@IdPrecio", Convert.ToInt32(Precio.Text)); 
    cmd.Parameters.AddWithValue("@IdStock", Convert.ToInt32(Stock.Text)); 

Wie kann ich erhalten ihre Benutzer eingegebenen Werte?

Antwort

0

Haben Sie versucht, den Code in der Page_Load-Methode innerhalb eines Blocks mit

if (!IsPostBack) 
{ 
    // 
} 

Eine andere Sache, die Sie versuchen können, setzen, wenn dies nicht funktioniert, um die typisierte-in-Werte in Session-Variablen zu speichern.

Ich glaube nicht, dass der InsertButton hier wichtig ist. Übrigens, wenn Sie den runat = server für die Objekte verwenden, müssen Sie FindControl nicht verwenden, der Server kann es verwalten. Auch für dynamische Steuerelemente möchten Sie möglicherweise einen anderen Ansatz ausprobieren, wie zum Beispiel: GridView (Entfernen von Headern und es sieht nicht wie ein Gitter aus), eine DataList oder eine ListView. Innerhalb des ItemTemplate befinden sich die Objekte, die Sie dynamisch wiederholen/erstellen. Sie können hier Beschriftungen und Textfelder hinzufügen. Zum Beispiel:

<asp:ListView ID="repeatedStuff" runat="server"><ItemTemplate>             
</ItemTemplate> 
</asp:ListView> 

Oder

<asp:DataListID="list" 
CellPadding="2" 
RepeatDirection="Vertical" 
RepeatLayout="Table" 
RepeatColumns="2" 
runat="server"> 
<ItemTemplate> 

<asp:CheckBoxID="cboxP"AutoPostBack="True"runat="server"/> 
<asp:Labelrunat="server"Text='<%#Bind("Nombre")%>'ID='<%#Bind("ID")%>'></asp:Label> 

</ItemTemplate> 
</asp:DataList> 

Was bleibt nach diesem Ansatz der Bindung und wie ist die Verwaltung, sie zu identifizieren, wenn ein Ereignis ausgelöst wird. Wie beim Hinzufügen eines textchange-Ereignisses auf der Serverseite, wenn Sie den ID-Wert für das Ereignis binden, fragen Sie nach der ID des Absenders, und dann können Sie wissen, welches "textchanged" ist.

+0

Danke für Ihre Antwort Fenrir88. Ich habe den Muestra_Precio_Stock_BT_Click-Code, also denjenigen, der die Steuerelemente erstellt, in Page_Load wie angegeben eingefügt, aber die Werte sind immer noch 0, meinst du den Code von InsertButton_Click? – Mazinger

+0

Hmm ... okay, um sicher zu sein, könnten Sie vielleicht den Page_Load Ereigniscode teilen. Wenn ich den Code richtig verstehe, wenn Sie auf die Schaltfläche Muestra_Precio_Stock klicken, weisen Sie den Beschriftungen und der Textbox Null zu (wodurch Daten in ihnen gelöscht werden). Wenn ein Element ausgewählt ist, erstellen Sie es erneut und fügen Sie den Text des ausgewählten Elements hinzu. Ist das richtig? – Fenrir88

+0

Ok Fenrir88, es ist dank ein paar Hinweisen, die du mir gegeben hast, gelöst worden, wie das Einfügen des Codes in das Load_Page-Event und das Entfernen von Null-Assigments für die Steuerelemente, hmmm und naja, nennen wir es "ein kleines Detail" ... Wenn Sie achten am Ende meiner INSERT-Anweisung, nun ... ICH HABE ZWISCHEN DEN TEXTBOXEN-WERTEN ZULETZT HINZUGEFÜGT "- Oh, es war meine Schuld, Entschuldigung. Aber wie ich schon sagte, Ihre Hinweise waren essentiell, also danke Sie wieder. – Mazinger