2009-06-17 66 views
1

首先,我意识到大多数情况下也可以使用ItemTemplates来完成。如果我试图做的只是不可能的,我会考虑使用它们。没有在RowCommand事件上注册任何控件的GridView单元

这里是我的困境的基础:

我有是在代码隐藏加载ASPX页面一个GridView。每行都包含几个触发OnRowCommand事件的按钮。当有人点击“编辑”按钮时,我创建一个TextBox对象并将其添加到特定单元格的Controls集合中。

这工作正常。

问题是,当用户单击“保存”按钮时,OnRowCommand被再次触发,但单元格在Controls集合中注册了0个项目。我很确定这是在PostBack之前发生的,所以我不确定为什么我不能访问TextBox控件。

我最初添加文本框后检查,它显示单元格中的1控制。在将页面加载到文本框并单击按钮之间的某处,这些控件已经丢失。谷歌没有太多的帮助。有任何想法吗?

回答

1

要动态创建文本框,所以你必须在每个岗位网格重新绑定回来,给你的文本框和ID(总是相同),并重新连接任何事件处理程序。

+0

我没有意识到控件在回发中丢失了。结束时只是从'Request.Form'对象获取我想要的值。仍然希望在不为所有内容创建TemplateField的情况下延长控件的使用寿命。 – beardog 2009-06-17 14:44:02

1

当用户单击编辑按钮时,您处于GridView的编辑模式。你还需要设置它?

1

如果您正在创建控件,它们将始终在回发中消失,这意味着您将不得不在每个循环中继续创建它们。

我个人建议坚持使用ItemTemplates,并让自己从这些所能提供的头痛中解脱出来。

1

当您在代码后面创建按钮时,您可以使用委托创建一个附加程序。处理程序将在rowcommand之前触发。

Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated 

Dim btnsave As New ImageButton 
If e.Row.RowType <> DataControlRowType.Pager And e.Row.RowType <> DataControlRowType.Header Then 
    AddHandler btnedit.Click, AddressOf btnedit_Click 
    GridView1.Rows(i).Cells(8).Controls.Add(btndel) 
end if 

end sub 

Public Delegate Sub ImageClickEventHandler(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
Sub btnedit_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) 

//do whatever you want here. 
//possibly a redirect to the current page so nothing else fires 

end sub 
+0

我欣赏代码示例,但我最终得到了另一种解决方案。谢谢。 – beardog 2009-06-17 14:47:13

相关问题