1

我有一个名为 Default.aspx 的 asp.net 页面,它的母版页是 Site.master。在 Default.aspx 中,我添加了一个带有 3 个数据绑定字段和 1 个模板字段的网格视图,然后在此模板字段中拖动了一个文本框。

图像模板字段编辑器

我正在尝试使用 FindControl 方法获取此网格视图中每一行的文本框值,但它没有返回任何内容。

这是我用来检索这些值的代码:

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

但我总是得到一个空的文本框。

谢谢大家!

4

2 回答 2

4

您需要将Page_Load代码更新为此:

If Not IsPostBack Then
    GridView1.DataSource = f.xDa
    GridView1.DataBind()
End If

当您的代码到达Button_Click事件时,它已经使用数据库中的数据重新填充了 GridView(覆盖了用户在 TextBox 中键入的内容)。

我在上面添加的代码只在第一次加载数据 - 然后 ASP.NET 视图状态处理确保 GridView 的状态保持最新。

于 2013-10-02T20:42:13.617 回答
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

Cells(0) 中的 (0) 是您尝试访问的网格视图中的列号。例如,如果“TextBox1”是第 1 列,则使用 Cells(0),如果是第 2 列,则使用 Cells(1),依此类推。这允许检索文本框中的文本,而无需在 Page_Load 中添加额外的部分

于 2015-08-19T23:07:09.193 回答