【问题标题】:Fire a RowCommand event from ImageButton created dynamically inside ITemplate从 ITemplate 中动态创建的 ImageButton 触发 RowCommand 事件
【发布时间】:2012-03-31 18:50:28
【问题描述】:

我有一个基于 DropDownList 的值动态创建的 GirdView。 我使用 ITemplate 接口来生成字段:

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

编辑: 我在 DropDownList 的 SelectedIndexChanged 事件中调用该过程 ddl_tipi_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

【问题讨论】:

    标签: c# asp.net .net gridview rowcommand


    【解决方案1】:

    我遇到了同样的问题 - 但我的问题出现在 EnableViewState="false" 的母版页中。 在我将母版页设置为使用 EnableViewState="true" 后,onrow 命令运行良好。

    【讨论】:

      【解决方案2】:

      我将您的代码按原样进行了测试。此代码没有错误。行命令也被正确触发。我认为问题在于您创建的动态网格视图的事件绑定。

      要触发行命令,必须在每次回发时创建 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 控件不存在。因此无法触发任何事件。

      【讨论】:

      • @SimoneFoschi :gridview 是动态创建还是动态填充?因为在您选择的索引更改事件中没有网格视图的初始化。在这种情况下,您可能唯一缺少的是 OnRowCommand="rowcommandfunction" 在 aspx 页面上。
      • 已解决,我将初始化代码放在 page_load 事件中,并按预期触发 rowcommand
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2021-04-01
      相关资源
      最近更新 更多