所以我用自动生成的列获得了这个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>")
每个细胞都是假的。也就是说,没有单元格识别出它具有控制权。这似乎是出现超出范围错误消息的原因。
任何人都可以告诉我为什么控件不存在,即使我可以在我的页面上看到它的计划吗?
提前致谢!
答案 0 :(得分:1)
您在RowDataBound中创建的任何控件都将在回发时丢失。