2016-03-28 4 views
0

皆さん、ありがとうございます。ダイナミックコントロールにアクセスする値をどのように保持する

私はいくつかのスレッドについて読んでいますが、私は非常に混乱しています。事は私が動的に...このコードwhith 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イベントに同じコードを入れました。そして今、私はフォームビューのINSERTボタンをクリックすると、作成されたコントロールを取得し、nullpointerexception(これは私の最初の問題でした)を避けることができます。問題は

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

どのように保存することができます...、動的に作成されたテキストボックスは常に0を返し、その値を失った実行は、これらの行に到達したときに

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

あなたは、これが動作しない場合は、試みることができるもう一つは、セッション変数で入力された-の値を保存している

if (!IsPostBack) 
{ 
    // 
} 

でブロック内Page_Loadメソッド内のコードを入れしようとしています。

ここでInsertButtonは重要ではないと思います。ちなみに、FindControlを使用する必要のないオブジェクトでrunat = serverを使用すると、サーバーはそのオブジェクトを管理できます。また、ダイナミックコントロールの場合、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を尋ねると、どちらが「テキスト変更されましたか」を知ることができます。

+0

あなたの答えFenrir88に感謝します。私はMuestra_Precio_Stock_BT_Clickコードを配置しました。これは、あなたが特化したように、Page_Loadにコントロールを作成するものですが、値は0です。InsertButton_Clickのコードを意味しましたか? – Mazinger

+0

ええと...これは確かにあなたがPage_Loadイベントコードを共有する可能性があります。コードが正しく理解されていれば、Muestra_Precio_StockボタンをクリックするとラベルとテキストボックスにNullが割り当てられます(ラベル内のデータは削除されます)。次に、アイテムが選択されている場合は、アイテムを再度作成し、選択したアイテムのテキストを追加します。これは正しいです? – Fenrir88

+0

Ok Fenrir88、Load_Pageイベント内にコードを入れて、コントロール、hummm、よく、そして、aのnull assigmentsを削除するなど、私がくれた手がかりのいくつかのおかげで解決しました。あなたは私のINSERTステートメントの最後に注意を払っています...私はテキストボックスの値の代わりに0以上を渡していました ":-O、それは私のせいでした、申し訳ありませんが、前にも述べたように、あなたの手がかりは必須です。 – Mazinger