对Gridview的批量更新失败,HasControls返回False

时间:2014-03-05 14:54:50

标签: asp.net vb.net gridview

所以我用自动生成的列获得了这个Gridview。生成的自动是必要的,因为网格内容基于数据透视表,并且大多数列都未提前知道。

然后我将网格中的大多数单元格更改为文本框ala:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        For i As Integer = 5 To e.Row.Cells.Count - 1
            Dim txtbox As New TextBox()
            txtbox.Text = e.Row.Cells(i).Text
            txtbox.Width = 75                
            e.Row.Cells(i).Controls.Add(txtbox)
        Next
    End If

End Sub

这就像一个冠军。然后我有一个Save按钮,它循环遍历所有单元格并将所有内容写回我的数据源,如下所示:

Protected Sub ButtonSave_Click(sender As Object, e As EventArgs) Handles ButtonSave.Click

    Dim rowCounter As Integer = 0

    For Each row As GridViewRow In GridView1.Rows
        For columnCounter As Integer = 5 To 16

            Dim tempTextbox As TextBox = DirectCast(GridView1.Rows(rowCounter).Cells(columnCounter).Controls(0), TextBox)
            Dim intValue As Integer = CInt(tempTextbox.Text)

            SqlDataSourceExcelGridTest.UpdateParameters.Clear()
            SqlDataSourceExcelGridTest.UpdateParameters.Add("DepartmentNumber", GridView1.Rows(rowCounter).Cells(2).Text)
            SqlDataSourceExcelGridTest.UpdateParameters.Add("ProjectNumber", GridView1.Rows(rowCounter).Cells(3).Text)
            SqlDataSourceExcelGridTest.UpdateParameters.Add("Alias", GridView1.Rows(rowCounter).Cells(4).Text)
            SqlDataSourceExcelGridTest.UpdateParameters.Add("WorkWeek", GridView1.HeaderRow.Cells(columnCounter).Text)
            SqlDataSourceExcelGridTest.UpdateParameters.Add("WorkHours", intValue)
            SqlDataSourceExcelGridTest.Update()

        Next

        rowCounter += 1
    Next

    GridView1.DataBind()

End Sub

几乎有效。如果我注释掉有关tempTextbox的内容并观察我的SQL Server Profiler,我会看到所有值都正确传递,除了 Workhours - 这是可编辑的单元格。如果我留下关于tempTextbox的位,我会收到错误 指定参数超出有效值范围 。这种情况发生在tempTextbox的声明中,当DirectCasting到应该在所需单元格中的控件时。

所以我注释掉了我的更新逻辑,而是把它放到了Click事件中:

Response.Write("Row: " & rowCounter & " Column: " & columnCounter & " Has Controls? " & GridView1.Rows(rowCounter).Cells(columnCounter).HasControls.ToString & "<br>")

每个细胞都是假的。也就是说,没有单元格识别出它具有控制权。这似乎是出现超出范围错误消息的原因。

任何人都可以告诉我为什么控件不存在,即使我可以在我的页面上看到它的计划吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您在RowDataBound中创建的任何控件都将在回发时丢失。