我正在动态地将链接按钮添加到我的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)中调用。
问题是,当我点击链接按钮时,genericLinkButton_Click事件会在我第一次点击时触发不。它会导致回发,然后如果我再次单击它,或者单击其他链接按钮之一,则会触发genericLinkButton_Click事件 。
如何确保点击事件在我第一次点击时发生?
谢谢!
答案 0 :(得分:1)
RowDataBound
,因此当您调用gvData.DataBind()
时。但是必须在每次回发时再次创建动态创建的控件。
在GridView
中动态创建控件的最合适的事件是RowCreated
,它会在每次回发时触发。请注意,GridbackRow的DataItem
在回发时为null
。所以你不能访问它的数据源而不是RowDataBound
。但这似乎没有必要在这里。
另请注意,您无需循环RowDataBound
或RowCreated
中的所有行,因为无论如何都会为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);
}
}
应该有效。