对于gridView中的动态创建按钮,未触发行命令事件

时间:2014-09-19 10:42:16

标签: c# asp.net gridview

我有一个GridView,我在gv_RowDataBound上动态创建Label和Button。

的.cs

Label Tagvalue = new Label();
Tagvalue.ID = "lblTags_"+i;
//Tagvalue.CssClass = "tagBubble tagBubbleDelete";
Tagvalue.Text = tag;

Button delete = new Button();
delete.ID = "btnDelete_" + i;
delete.ToolTip = "Delete";
delete.CssClass = "tagBubbleDelete";
delete.CommandName = "Delete";
delete.CommandArgument = imageID.Text;

问题是“RowCommand”函数没有被触发。所以我无法访问e.CommandName ==“删除”。

如何为GridView中的动态创建按钮触发RowCommand事件。

任何帮助都是赞赏的。

******* EDIT

的.aspx

 <asp:GridView runat="server" ID="myGV" AllowSorting="false" AllowPaging="False"
                        PageSize="20" AutoGenerateColumns="False"  

                        DataSourceID="LDSgv" 
                        ondatabound="gv_DataBound"
                        OnRowDataBound="gv_RowDataBound"
                        OnRowCommand="gv_RowCommand"
                        >
  <asp:TemplateField HeaderText="Details" HeaderStyle-CssClass="noSort"
                                    ItemStyle-CssClass="fieldAlignCenter">
                                    <ItemTemplate>
                                      <div class="alignLeft marginTop5 float-l" id="Tags" runat="server"                         style="clear:both">
                                          //**Here I am adding the dynamic Buttons  
                                        </div>
                                       </ItemTemplate>
                                     </asp:TemplateField>
                                </asp:GridView>

3 个答案:

答案 0 :(得分:1)

  

问题是您正在创建按钮gv_RowdataBound事件   当你点击按钮时,页面重新加载,按钮就是   这次没有创建,因为你已经编写了代码   gv_RowDataBound event.So按钮将无效,因为没有   按钮!

     

你应该尝试这样

protected void Page_Init(object sender, EventArgs e)
    {
        GridView1.DataBind(); //Key code
    }

    protected void gv_DataBound(object sender, EventArgs e)
    {

                Button delete = new Button();
               delete.ID = "btnDelete_" + i;
                delete.ToolTip = "Delete";
               delete.CssClass = "tagBubbleDelete";
               delete.CommandName = "Delete";
               delete.CommandArgument = imageID.Text;


    }

    protected void gv_RowCommand(object sender, CommandEventArgs e) //Your grid view function change accroding you need!!
    {
        if (e.CommandName == "Delete")
        {

        }
    }
  

我不确定它会100%起作用,但至少你会试试这个

更新

  

如果您在page_load绑定gridview,则必须使用此代码

 protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack) 
           {
            YourGridviewbindCode(); //Key code
            }      
        }
  

因为如果你每次绑定gridview它可能会取消Button click的效果!

答案 1 :(得分:1)

试试这个

 protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack) 
       {
        gridbind();
       }      
    }

答案 2 :(得分:1)

感觉良好回答自己的问题。 我尝试了以下方法:

    //**OnPage Load
     if (IsPostBack)
        {
            //String ButtonID = Page.Request.Params["__EVENTTARGET"];

            Control c = GetPostBackControl(this.Page);
            if (c != null)
            {
                //...
                var ID = c.ID;
            }
            else
            {
                Mygv.DataBind();
            }
        }

     protected Control GetPostBackControl(Page page)
      {
        Control control = null;

        string ctrlname = page.Request.Params.Get("__EVENTTARGET");
        if (ctrlname != null && ctrlname != string.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        else
        {
            foreach (string ctl in page.Request.Form)
            {
                Control c = page.FindControl(ctl);
                if (c is System.Web.UI.WebControls.Button)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }

这里我首先找到导致PostBack的控件。 如果控件是(非NULL),即(如果不是动态创建的)控件,则不要PostBack。 另外,PostBack用于动态创建的控件。