Fry RowCommand event from ImageButton created dynamically inside ITemplate

I have a dynamically created GirdView based on the DropDownList value. I am using ITemplate interface to create fields:

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

     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;


Now I want to run a RowCommand from this dynamically created column with a command argument and command name limited to this ImageButton

code to work:

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



All this code works fine, but doesn't trigger the RowCommand from the GridView when the ImageButton is clicked

EDIT: I am calling the procedure on the SelectedIndexChanged event in the DropDownList ddl_tipi_SelectedIndexChanged (object sender, 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")))
            Dim rdr As SqlDataReader = cmd.ExecuteReader
            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
                            b_crea_controllo = False
                        End If

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


                    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

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

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



source to share

2 answers

I took your code as is and tested it. there are no errors in this code. Also the line command runs correctly. I guess the problem is with the eventbinding of the generated dynamic gridview.

For the row command to be run, a gridview must be created on every postback. and the event must be linked.

The code you provided is not exactly what I need. It has no mesh view initialization.

The following should give you some idea.

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.


The server does not track dynamically created controls. Therefore, when feedback occurs, the gridview control does not exist. and therefore no event can be triggered.



I had the same problem but my problem was on the main page where EnableViewState = "false". The onrow command worked fine after I set the master page to use EnableViewState = "true".



All Articles