2016-03-28 56 views
0

大家好,提前致谢,如何保存访问动态控件的值

我已经读了几个线程,但我很困惑。事情是我动态创建一个控制面板内的一些文本框被置于一个FormView蒙山代码里......

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

好了,这工作得很好,当我运行该项目的文本框和标签创建正如所料,我可以看到它们并写入文本框。我已经将相同的代码放入Page_Load事件中,现在我可以获取创建的控件,并在单击formview的INSERT按钮时避免出现nullpointerexception(这是我的第一个问题)。问题是,在下面的代码...

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

    } 
当执行到达这些线路

,动态创建文本框失去了他们的价值,总是返回0 ...

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

我如何保存他们的用户输入值?

回答

0

你有没有尝试把代码在Page_Load方法块内部与

if (!IsPostBack) 
{ 
    // 
} 

另一件事你可以尝试,如果这不起作用在Session变量是保存键入的值。

我不认为InsertButton在这里很重要。顺便说一下,如果您在对象上使用runat = server,则不必使用FindControl,服务器将能够对其进行管理。另外对于动态控件,你可能想要尝试一种不同的方法,如:GridView(删除标题,它看起来不像一个网格),一个DataList或一个ListView。 ItemTemplate内部是您动态重复/创建的对象。你可以在这里添加标签和文本框。例如:

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

或者

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

这种方式管理后剩下的结合,以及如何识别它们时被触发的事件。就像在服务器端添加一个textchange事件一样,如果您绑定事件的ID值,则请求发件人的ID,然后您就可以知道哪个是“textchanged”。

+0

感谢您的回答Fenrir88。我已经在您指定的Page_Load中放置了创建控件的Muestra_Precio_Stock_BT_Click代码,但值仍然为0,您的意思是InsertButton_Click的代码吗? – Mazinger

+0

嗯...好的,可以确定这可能你可以分享Page_Load事件代码。如果我正确理解代码,单击Muestra_Precio_Stock按钮时,您将为标签和文本框(将删除其中的数据)分配Null。然后,如果选择了一个项目,则再次创建它们并将它们添加到所选项目的文本中。它是否正确? – Fenrir88

+0

好的Fenrir88,它解决了你给我的一些线索,比如把代码放在Load_Page事件中,删除控件,hummm,以及a的空分配,我们称之为“一个小细节”... If你在我的INSERT语句结尾处注意,好吧......我正在通过0正好忽略了TEXTBOXES的值“:-O,这是我的错,对不起,但正如我之前所说的,你的线索是必需品,所以谢谢你再次。 – Mazinger