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);
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;
}
}
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";
gw_tipi.Columns.Add(order_col);
}
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")))
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
source to share
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.
source to share