2012-03-15 6 views
3

DropDownListの値に基づいて動的に作成されたGirdViewがあります。 私はフィールドを生成するITemplateインターフェイスを使用します。ITemplate内で動的に作成されたImageButtonからRowCommandイベントを発生させます

public class CreateItemTemplateOrder : ITemplate 
{ 
    ImageButton imgbtn_up; 
    ImageButton imgbtn_down; 

    string s_imgbtn_up_name; 
    string s_imgbtn_up_ImageUrl; 
    string s_imgbtn_up_CommandName; 
    string s_imgbtn_up_CommandArgument; 

    public CreateItemTemplateOrder(string imgbtn_up_name, string imgbtn_up_ImageUrl, string imgbtn_up_CommandName, string imgbtn_up_CommandArgument) 
    { 

     this.s_imgbtn_up_name = imgbtn_up_name; 
     this.s_imgbtn_up_ImageUrl = imgbtn_up_ImageUrl; 
     this.s_imgbtn_up_CommandName = imgbtn_up_CommandName; 
     this.s_imgbtn_up_CommandArgument = imgbtn_up_CommandArgument; 

    } 

    public void InstantiateIn(Control objContainer) 
    { 
     imgbtn_up = new ImageButton(); 
     imgbtn_up.DataBinding += new EventHandler(imgbtn_up_DataBinding); 
     objContainer.Controls.Add(imgbtn_up); 
    } 

    private void imgbtn_up_DataBinding(object sender, EventArgs e) 
    { 
     ImageButton imgbtn_up = (ImageButton)sender; 
     imgbtn_up.ID = s_imgbtn_up_name; 
     imgbtn_up.ImageUrl = s_imgbtn_up_ImageUrl; 
     imgbtn_up.CommandName = s_imgbtn_up_CommandName; 
     imgbtn_up.CommandArgument = s_imgbtn_up_CommandArgument; 
     imgbtn_up.CausesValidation = false; 
    } 
} 

は、今私は、コマンドの引数とコマンド名で、この動的に生成された列からRowCommandを発射したいが、この作業を取得するために、こののImageButton

にコードを有界であります:

Protected void inizializza_gw_tipi(){ 
     TemplateField order_col = new TemplateField; 
     order_col.ItemTemplate = new CreateItemTemplateOrdine("imgbtn_up", "~/imgs/Up.gif", "minus", "order"); 
     order_col.HeaderText = "order"; 
     order_col.SortExpression = "order"; 

     gw_tipi.Columns.Add(order_col); 
} 

すべてこのコードは正常に動作しますが、のImageButtonをクリックしたときにGridViewからRowCommandを発射しない

EDIT: 私はDropDownListコントロール ddl_tipi_SelectedIndexChangedのSelectedIndexChangedイベント(オブジェクト送信者、System.EventArgs e)の {inizializza_gw_tipi()プロシージャを呼び出します。 gw_tipi.DataBind(); }

Protected Sub inizializza_gw_tipi() 
     Using cn As New SqlConnection(shared_foos.connectionString) 
     Using cmd As New SqlCommand("SELECT nome_tabella, nome_campo_id, nome_campo_nome, nome_campo_descrizione, has_order FROM maschere_tipi WHERE id = @id", cn) 
      cmd.Parameters.AddWithValue("id", IIf(Session("sel_val") Is Nothing, "", Session("sel_val"))) 
      cn.Open() 
      Dim rdr As SqlDataReader = cmd.ExecuteReader 
      rdr.Read() 
      If rdr.HasRows Then 
       Dim b_crea_controllo As Boolean = True 
       'controllo se mettere o no la colonna ordine 
       If rdr("has_order") = True Then 
        'controllo che la colonna non sia già stata inserita, 
        'se è già stata inserita la rimuovo e la ricreo 
        For i As Integer = 0 To gw_tipi.Columns.Count - 1 
         If gw_tipi.Columns(i).HeaderText = "ordine" Then 
          'gw_tipi.Columns.Remove(gw_tipi.Columns(i)) 
          b_crea_controllo = False 
         End If 
        Next 

        If b_crea_controllo = True Then 

         Dim ordine_col As New TemplateField() 
         ordine_col.ItemTemplate = New CreateItemTemplateOrdine("lbl_ordine", "ordine", "imgbtn_up", "~/imgs/Up.gif", "meno", "ordine", "imgbtn_down", "~/imgs/Down.gif", "piu", "ordine", AddressOf ImageCommand) 
         ordine_col.HeaderText = "ordine" 
         ordine_col.SortExpression = rdr("nome_campo_nome") 

         gw_tipi.Columns.Add(ordine_col) 

        End If 
       End If 

       b_crea_controllo = True 

       For i As Integer = 0 To gw_tipi.Columns.Count - 1 
        If gw_tipi.Columns(i).HeaderText = rdr("nome_campo_nome") Then 
         b_crea_controllo = False 
        End If 
       Next 

       If b_crea_controllo = True Then 
        Dim nome_col As New TemplateField() 
        nome_col.ItemTemplate = New CreateItemTemplateLabel("lbl_nome", rdr("nome_campo_nome")) 
        nome_col.HeaderText = rdr("nome_campo_nome") 
        nome_col.SortExpression = rdr("nome_campo_nome") 
        gw_tipi.Columns.Add(nome_col) 
       End If 

       b_crea_controllo = True 

       For i As Integer = 0 To gw_tipi.Columns.Count - 1 
        If gw_tipi.Columns(i).HeaderText = rdr("nome_campo_descrizione") Then 
         b_crea_controllo = False 
        End If 
       Next 

       If b_crea_controllo = True Then 
        Dim descrizione_col As New TemplateField() 
        descrizione_col.ItemTemplate = New CreateItemTemplateLabel("lbl_descrizione", rdr("nome_campo_descrizione")) 
        descrizione_col.HeaderText = rdr("nome_campo_descrizione") 
        descrizione_col.SortExpression = rdr("nome_campo_descrizione") 
        gw_tipi.Columns.Add(descrizione_col) 
       End If 

       Dim str_order_by As String = " ORDER BY " 
       Dim str_ordine As String = "" 

       If rdr("has_order") = True Then 
        str_ordine = ", ordine " 
        str_order_by &= "ordine" 
       Else 
        str_order_by &= rdr("nome_campo_nome") 
       End If 

       Dim sqlds_tipi As New SqlDataSource(shared_foos.connectionString, "SELECT " & rdr("nome_campo_id") & ", " & rdr("nome_campo_nome") & ", " & rdr("nome_campo_descrizione") & str_ordine & " FROM " & rdr("nome_tabella") & str_order_by) 

       gw_tipi.DataSource = sqlds_tipi 

      End If 
     End Using 
    End Using 

End Sub 

答えて

2

あなたのコードをそのまま使用してテストしました。このコードにはエラーはありません。また、rowコマンドが適切に起動されます。私はあなたが作成した動的グリッドビューのイベントバインディングに問題があると推測します。

rowコマンドをトリガーするには、すべてのポストバックでgridviewを作成する必要があります。イベントは縛られるべきです。

あなたが提供したコードは、私が必要とするものではありません。グリッドビューの初期化はありません。

以下は、あなたにいくつかの洞察を与えるはずです。

GridView GV = new GridView(); //Make sure to create the grid view on every postback and populate it. Alternatively (i dont know if its a good practice.) you can store a reference of gridview in session. 
GV.RowCommand += new GridViewCommandEventHandler(GV_RowCommand); //bind the row command event. this should solve the problem. 

サーバーは動的に作成されたコントロールを追跡しません。したがって、ポストバックが発生すると、gridviewコントロールは存在しません。したがって、イベントをトリガすることはできません。

+0

投稿者 –

+0

@SimoneFoschiが回答を編集 – Gnani

+0

@SimoneFoschi:Gridviewは動的に作成されるの?選択したインデックス変更イベントではグリッドビューの初期化が行われないためです。その場合、欠落しているのは、aspxページの** OnRowCommand = "rowcommandfunction" **だけです。 – Gnani

0

私は同じ問題を抱えていましたが、私の問題はマスターページにあり、EnableViewState = "false"でした。 EnableViewState = "true"を使用するようにマスターページを設定した後、onrowコマンドが正常に機能しました。