我有一个名为Default.aspx的asp.net页面,它的主页面是Site.master。在Default.aspx中,我添加了一个包含3个数据绑定字段和1个Templatefield的gridview,然后在此模板字段中拖动了一个TextBox。
我正在尝试使用FindControl方法获取此gridview中每行的文本框值,但它返回Nothing。
以下是我用来检索这些值的代码:
For Each gvr As GridViewRow In GridView1.Rows
Dim tb As TextBox = DirectCast(gvr.FindControl("TextBox1"), TextBox)
Dim txt As String = tb.Text
MsgBox(txt)
Next
注意:我正在使用masterPages,我认为这会导致问题。
[编辑]
在Page_load事件中,为了绑定gridview,我正在使用代码:
GridView1.DataSource = f.xDa
GridView1.DataBind()
在Button1中,我添加了代码:
For Each gvr As GridViewRow In GridView1.Rows
Dim tb As TextBox = DirectCast(gvr.FindControl("TextBox1"), TextBox)
Dim txt As String = tb.Text
MsgBox(txt)
Next
但我总是得到一个空的文本框。
谢谢大家!
答案 0 :(得分:4)
您需要将Page_Load
代码更新为:
If Not IsPostBack Then
GridView1.DataSource = f.xDa
GridView1.DataBind()
End If
当您的代码进入Button_Click
事件时,它已经使用数据库中的数据重新填充GridView(覆盖用户键入TextBox的内容)。
我上面添加的代码导致数据仅在第一次加载 - 然后ASP.NET视图状态处理确保GridView的状态保持最新。
答案 1 :(得分:0)
我遇到了类似的问题,但是我的gridview没有在Page_Load中呈现,因此我无法将“If Not IsPostBack”绑定添加到Page_Load,因为我正在使用的SQL数据集尚未声明。
如果您不能使用Page_Load gridview数据绑定,而不是FindControl并按名称调用文本框,尝试这样的操作可能会有效:
For Each gvr As GridViewRow In GridView1.Rows
Dim txt As String = CType(gvr.Cells(0).Controls(0), TextBox).Text
MsgBox(txt)
Next
单元格(0)中的(0)是您尝试访问的gridview中的列号。因此,例如,如果“TextBox1”是第1列使用Cells(0),如果是第2列则使用Cells(1),依此类推。这允许检索文本框中的文本,而无需在Page_Load
中添加其他部分