动态添加链接按钮不会在第一次单击时触发on click事件 - C#

时间:2014-07-14 20:09:21

标签: c# html asp.net

我正在动态地将链接按钮添加到我的Gridview中,如下所示:

protected void addLinks()
{
    foreach (GridViewRow gvr in gvData.Rows)
    {
        if (gvr.RowType == DataControlRowType.DataRow)
        {
            string itemNbr = gvr.Cells[1].Text;
            LinkButton lb = new LinkButton();
            lb.Text = itemNbr;
            lb.Click += genericLinkButton_Click;
            foreach (Control ctrl in gvr.Cells[1].Controls)
            {
                gvr.Cells[1].Controls.Remove(ctrl);
            }
            gvr.Cells[1].Controls.Add(lb);
        }
    }
}

这个addLinks()函数在我的gridview_RowDataBound事件和Page Load事件if(isPostPack)中调用。

问题是,当我点击链接按钮时,genericLinkBut​​ton_Click事件会在我第一次点击时触发。它会导致回发,然后如果我再次单击它,或者单击其他链接按钮之一,则会触发genericLinkBut​​ton_Click事件

如何确保点击事件在我第一次点击时发生?

谢谢!

2 个答案:

答案 0 :(得分:1)

仅当GridView获取数据绑定时才会触发

RowDataBound,因此当您调用gvData.DataBind()时。但是必须在每次回发时再次创建动态创建的控件。

GridView中动态创建控件的最合适的事件是RowCreated,它会在每次回发时触发。请注意,GridbackRow的DataItem在回发时为null。所以你不能访问它的数据源而不是RowDataBound。但这似乎没有必要在这里。

另请注意,您无需循环RowDataBoundRowCreated中的所有行,因为无论如何都会为GridView中的每个行触发这些事件

protected void gvData_RowCreated(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string itemNbr = e.Row.Cells[1].Text;
        LinkButton lb = new LinkButton();
        lb.Text = itemNbr;
        lb.Click += genericLinkButton_Click;
        foreach (Control ctrl in e.Row.Cells[1].Controls)
        {
            e.Row.Cells[1].Controls.Remove(ctrl);
        }
        e.Row.Cells[1].Controls.Add(lb);
    }
}

答案 1 :(得分:1)

我不得不为WebForms而烦恼。

使用Webforms并动态创建控件时,您需要在将控件添加到树之前为创建的控件分配ID,以使它们正常工作。否则,他们将在页面生命周期中更改ID,从而导致所描述的行为。

private int _runningIndex = 0;
protected void gvData_RowCreated(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string itemNbr = e.Row.Cells[1].Text;
        LinkButton lb = new LinkButton();
        lb.ID = "btn" + (_runningIndex++).ToString();
        lb.Text = itemNbr;
        lb.Click += genericLinkButton_Click;
        foreach (Control ctrl in e.Row.Cells[1].Controls)
        {
            e.Row.Cells[1].Controls.Remove(ctrl);
        }
        e.Row.Cells[1].Controls.Add(lb);
    }
}

应该有效。