【问题标题】:Row Command Event not fired for Dynamically created buttons inside gridView未为 gridView 中动态创建的按钮触发行命令事件
【发布时间】:2014-09-22 15:15:20
【问题描述】:

我有一个 GridView,我在其中动态地在 gv_RowDataBound 上创建标签和按钮。

.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=="Delete"。

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

感谢任何帮助。

*********编辑

.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>

【问题讨论】:

  • Delete 可能与 inbuild 事件冲突,请将名称改为 deleterow 之类的,然后重试
  • 也试过了。好像没用。
  • 问题是“RowCommand”事件本身没有被调用
  • 你是否在gridview中添加了rowcommand事件?
  • 我已经添加了。 Gridview 中的其他按钮工作正常。问题仅适用于动态创建的按钮。

标签: c# asp.net gridview


【解决方案1】:

问题是您正在创建按钮 gv_RowdataBound 事件 当您单击按钮时,页面会重新加载并且按钮是 这次没有创建,因为您在 gv_RowDataBound 事件。所以按钮不起作用,因为没有 按钮!。

你应该这样尝试

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点击的效果!

【讨论】:

  • 嘿还有一件事,你如何绑定网格视图意味着在哪里?
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

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

        //**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)即(如果不是动态创建的)控件,则不要回发。 Else PostBack 用于动态创建的控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多