为什么在GridView的RowDataBound中动态添加的Button无法触发事件?

解决方案 »

  1.   

    给你段代码,你自己看看吧        <asp:GridView ID="GridView1" runat="server" CellPadding="3" DataKeyNames="Id" GridLines="None"
                    BackColor="Black" CellSpacing="1" Width="95%" AutoGenerateColumns="False" AllowSorting="True" 
                    OnRowDataBound="GridView1_RowDataBound">
                        <asp:TemplateField HeaderText="选择">
                            <ItemTemplate>
                                <asp:Button ID="btnSelect" runat="server" Text="编辑" OnClick="btnSelect_Click" />
                                <asp:Button ID="btnDel" runat="server" Text="删除" OnClick="btnDel_Click" />
                            </ItemTemplate>
                            <ItemStyle Width="120px" />
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>在ONclick 里面去写事件
      

  2.   

    RowDataBound
    能动态添加服务器控件?
    是button客户端控件吧?
      

  3.   


        protected void gvlist_RowDataBound(object sender, GridViewRowEventArgs e)
        {        if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //gridviewStyle.rowAltColor(e, false, "");            int startCol = 4;
                string id = e.Row.Cells[startCol].Text.Trim();
                e.Row.Cells[startCol].ToolTip = "查看明细";
                e.Row.Cells[startCol].Attributes.Add("onclick", message.redirectUrl("add.aspx?id=" + id + userLoginData.menuUrl));
                gridviewStyle.TableCellAltColor(e.Row.Cells[startCol], true, "#FEDA9C");            string newvalue = string.Empty;
                regDAL dal = new regDAL();
                regModel model = new regModel();
                int gvColCount = e.Row.Cells.Count;
                for (int i = startCol + 1; i < gvColCount; i++)
                {
                    TableCell tcl = e.Row.Cells[i];
                    gridviewStyle.TableCellAltColor(tcl, false, "#EDFAFF");
                    string colTemp = tcl.Text.Trim();
                    if (colTemp.Length == 0) { continue; }                string[] arrColTemp = colTemp.Split(',');
                    int usertotal = arrColTemp.Length;
                    int userqs = 0, userqsNo = 0;
                    for (int j = 0; j < usertotal; j++)
                    {
                        if (arrColTemp[j] == null) continue;
                        string _arrColTemp = arrColTemp[j].ToString().Trim();
                        if (_arrColTemp.Length == 0) continue;
                        string[] arr_arrColTemp = _arrColTemp.Split(':');                    if (arr_arrColTemp.Length < 3) continue;                    if (arr_arrColTemp[0] == null || arr_arrColTemp[1] == null || arr_arrColTemp[2] == null) continue;
                        string arr_userno = arr_arrColTemp[0].ToString().Trim();
                        if (arr_userno.Length == 0) continue;                    if (arr_arrColTemp[1] == null || arr_arrColTemp[1].ToString().Trim().Length == 0)
                        {
                            if (userLoginData.sesUser.Equals(arr_userno))
                            {
                                Button btnuser = new Button();
                                btnuser.Text = "签收";
                                btnuser.ToolTip = "签收此单据|" + arr_userno + "|" + id;
                                btnuser.Click += new EventHandler(btnuser_Click);//此处绑定的事件不起作用!!!
                                tcl.Controls.Add(btnuser);
                            }
                            else
                            {
                                model = dal.GetModel(arr_userno);
                                if (model == null) continue;
                                Label lbluser = new Label();
                                lbluser.Text = model.name + " ";
                                lbluser.CssClass = "fontColor";
                                lbluser.ToolTip = "待签|" + arr_userno;
                                tcl.Controls.Add(lbluser);
                            }
                            userqsNo++;
                        }
                        else
                        {
                            string arr_userQs = arr_arrColTemp[1].ToString().Trim();
                            string arr_userDate = arr_arrColTemp[2].ToString().Trim();
                            model = dal.GetModel(arr_userQs);
                            if (model == null) continue;
                            Label lbluserQs = new Label();
                            lbluserQs.Text = model.name + " ";
                            lbluserQs.CssClass = "treeGreen";
                            lbluserQs.ToolTip = "已签|" + arr_userDate + "|" + arr_userQs;
                            tcl.Controls.Add(lbluserQs);
                            userqs++;
                        }
                    }
                    if (userqsNo > 0 || userqs > 0)
                    {
                        if (userqs == usertotal) { tcl.ToolTip = "签收完成"; tcl.BackColor = System.Drawing.Color.FromArgb(108, 194, 47); }
                        else if (userqs == 0) { tcl.ToolTip = "未签收"; tcl.BackColor = System.Drawing.Color.FromArgb(255, 227, 229); }
                        else if (userqs < usertotal) { tcl.ToolTip = "签收中"; tcl.BackColor = System.Drawing.Color.FromArgb(206, 201, 255); }
                    }
                    else
                    {
                        tcl.BackColor = System.Drawing.Color.FromArgb(222, 222, 222);
                        tcl.ToolTip = "无需签收";
                    }
                }
            }
        }
        protected void btnuser_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            string ma02 = btn.ToolTip.Trim();
            string[] _Arr = ma02.Split('|');
            if (_Arr.Length < 3) return;
            if (_Arr[2] == null) return;
            string SH002 = _Arr[2].ToString().Trim();
            if (SH002.Length == 0) return;        WPURMSHandOutDal dal = new WPURMSHandOutDal();
            WPURMSHandOutModel model = new WPURMSHandOutModel();
            model.SH002 = SH002;
            model.SH004 = SH002;
            model.SH005 = _Arr[1].ToString().Trim();
            int rv = dal.HandOutSign(model);        //getAllData();        SystemTools.displayTips("签收处理[" + SH002 + "]成功!", 1, lblInfoMsg);
        }代码如上面。因GridView的列是不定的,里面的按钮也是动态生成的!但是事件不起作用啊!
      

  4.   


    断点进去 委托是否绑定成功?如果绑定成功。请检查一下。 生成的Buttom 上是否有链接?
    运行下 看看 状态栏 有没地址?
      

  5.   

    先alter一下估计是某个地方手误写错了
      

  6.   

    出现这个问题主要是:
    你的控件状态没有被TrackViewState()方法跟踪。你应该是先把控件添加到页面的控件树中后再去设置他的属性和事件。这样TrackViewState()方法会自动记录你的控件状态。
    建议你试试写在row_create事件下
    并把添加代码改下为Button btnuser = new Button();
    tcl.Controls.Add(btnuser);                            btnuser.Text = "签收";
                                btnuser.ToolTip = "签收此单据|" + arr_userno + "|" + id;
                                btnuser.Click += new EventHandler(btnuser_Click);//此处绑定的事件不起作用!!!
                                
      

  7.   

      protected void Page_Load(object sender, EventArgs e)
        {
            
            this.Button1.Click += new EventHandler(bt_Click);
        }
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            ////
            this.Button1.Click += new EventHandler(bt_Click);
        }    protected void bt_Click(object sender, EventArgs e)
        {
            Response.Write("成功");
        }做了个测试。在GridView中
    绑定事件委托。 
    但是 GridView的委托类型是 GridViewRowEventArgs
    Button1.Click 的委托类型是 EventArgs 先触发的是 GridViewRowEventArgs 自然做不到 Click 事件 我把他 写在 Load事件里 就触发成功了。!
      

  8.   


    谢谢!搞定!!
    但这样每次都需要重新绑定GridView!
    不过还是谢谢了!!!