ASP.NET 回发时 GridView 为空
ASP.NET GridView empty on postback
ASP.NET GridView 在回发时为空,我需要一些帮助。我认为这可能与未设置 ViewState 有关。无论如何,在我重构代码之前,我最初让代码在单个用户表单上工作。
现在要画图了,我现在有一个母版页和一个基本表单。我的母版页有占位符,在我的实际用户表单中,我已将 GridView 放置在占位符范围内,如下所示:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMainBody" Runat="Server">
<asp:GridView ID="data" runat="server" AutoGenerateColumns="false" EnableViewState="true" ...>
...
</asp:GridView>
</asp:Content>
GridView 中的一个字段是一个可编辑的评论字段多行文本框(其余不可编辑):
<asp:TemplateField HeaderText="Comments">
<ItemTemplate>
<asp:TextBox ID="TextBoxComments" runat="server" TextMode="MultiLine" Rows="4" Columns="40" Text='<%# Bind("Comment")%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBoxCommentsEdit" runat="server" TextMode="MultiLine" Rows="4" Columns="40" Text='<%# Bind("Comment")%>' />
</EditItemTemplate>
</asp:TemplateField>
我编辑其中一行并单击提交按钮进行回发。 GridView 有 10 行要输入,但是在回发时有零行,所以我的保存丢失了!
我的基本表单包含 OnInit 事件中的代码以加载提交按钮,因此也处理点击事件。
我的 OnLoad 事件我调用了基础 Onload,它又调用了我的用户表单的 Page_Load 处理程序代码,其中有一行代码,即:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
MyBase.data = Me.data
End Sub
并在 BaseForm 中声明为:
Protected WithEvents data As GridView
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
If Not Page.IsPostBack Then
...
BindData(...)
...
End If
End Sub
这样我也可以处理BaseForm中的所有GridView事件
所以在 master/baseform/userform/viewstate 关系之间的某处,我的 GridView 数据在 PostBack 上丢失了。有什么想法吗?
在您的 Page_Load 上,仅当 IsPostBack
为 false 时才绑定数据。
您点击提交按钮,提交按钮触发 RowUpdating 事件,该事件包含更新数据库查询 table 并在执行更新查询后调用代码中的 BindData() 函数。
我想自己回答我自己的问题 - 万岁!我不知道这让我变得聪明还是愚蠢,因为我必须每天寻找更多的东西才能找到解决方案。也许我没有提供足够的信息或不清楚,这就是当你第一次做事时会发生的情况,你不知道自己在做什么。可能没有暗示但暗示的重要信息,我会为可能遇到相同问题的任何其他人详细说明,我是否在我的 OnInit 方法中遗漏了我调用以下代码:
Dim cpl As ContentPlaceHolder = Master.FindControl("ContentPlaceHolderFooter")
btnUpdate = New Button
btn.ID = "btnUpdate"
cpl.Controls.Add(btnUpdate)
我知道最纯粹的人会说你为什么不将按钮添加到网格的页脚而不是母版页中的附加内容占位符 - 好吧,我没有这样做。
无论如何,我将上面的代码移到了 CreateChildControls 可重写方法中,并且我还需要在我的 OnLoad 事件中额外调用 EnsureChildControls,所以我的 OnInit 方法重点瓦解了!@#%^* 为什么?好吧,在我对 "Rajan Chauhan" 的第二条评论中提到的这个网站上提出的另一个问题的答案中暗示了答案,我已经检查过了,显然每当你遍历控件集合时,你就会弄乱 ViewState (嘿,我只是重复另一个 post 中所说的内容,我对此事没有任何权限)在加载之前调用 Master.FindControl 在 OnInit 中是一个禁忌!
然而,由于我的 ItemTemplate 标记,我的 RowUpdated 事件并没有触发,因为我实际上是在视图模式下编辑的,所以我会坚持我所拥有的,因为我的 btnUpdate_Click 事件仍然像以前一样工作,即它执行了一些我在其他网站上找到的神奇代码,逐行检查数据更改,然后仅更新该特定行。好吧,我可以,因为最多只有 10 行,所以我不会使 ViewState 过载太多,如果知道我也使用分页很重要,所以实际上我有 10 多行,但不想像我想的那样提及这可能会增加混乱。
ASP.NET GridView 在回发时为空,我需要一些帮助。我认为这可能与未设置 ViewState 有关。无论如何,在我重构代码之前,我最初让代码在单个用户表单上工作。
现在要画图了,我现在有一个母版页和一个基本表单。我的母版页有占位符,在我的实际用户表单中,我已将 GridView 放置在占位符范围内,如下所示:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMainBody" Runat="Server">
<asp:GridView ID="data" runat="server" AutoGenerateColumns="false" EnableViewState="true" ...>
...
</asp:GridView>
</asp:Content>
GridView 中的一个字段是一个可编辑的评论字段多行文本框(其余不可编辑):
<asp:TemplateField HeaderText="Comments">
<ItemTemplate>
<asp:TextBox ID="TextBoxComments" runat="server" TextMode="MultiLine" Rows="4" Columns="40" Text='<%# Bind("Comment")%>' />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBoxCommentsEdit" runat="server" TextMode="MultiLine" Rows="4" Columns="40" Text='<%# Bind("Comment")%>' />
</EditItemTemplate>
</asp:TemplateField>
我编辑其中一行并单击提交按钮进行回发。 GridView 有 10 行要输入,但是在回发时有零行,所以我的保存丢失了!
我的基本表单包含 OnInit 事件中的代码以加载提交按钮,因此也处理点击事件。
我的 OnLoad 事件我调用了基础 Onload,它又调用了我的用户表单的 Page_Load 处理程序代码,其中有一行代码,即:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
MyBase.data = Me.data
End Sub
并在 BaseForm 中声明为:
Protected WithEvents data As GridView
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
If Not Page.IsPostBack Then
...
BindData(...)
...
End If
End Sub
这样我也可以处理BaseForm中的所有GridView事件
所以在 master/baseform/userform/viewstate 关系之间的某处,我的 GridView 数据在 PostBack 上丢失了。有什么想法吗?
在您的 Page_Load 上,仅当 IsPostBack
为 false 时才绑定数据。
您点击提交按钮,提交按钮触发 RowUpdating 事件,该事件包含更新数据库查询 table 并在执行更新查询后调用代码中的 BindData() 函数。
我想自己回答我自己的问题 - 万岁!我不知道这让我变得聪明还是愚蠢,因为我必须每天寻找更多的东西才能找到解决方案。也许我没有提供足够的信息或不清楚,这就是当你第一次做事时会发生的情况,你不知道自己在做什么。可能没有暗示但暗示的重要信息,我会为可能遇到相同问题的任何其他人详细说明,我是否在我的 OnInit 方法中遗漏了我调用以下代码:
Dim cpl As ContentPlaceHolder = Master.FindControl("ContentPlaceHolderFooter")
btnUpdate = New Button
btn.ID = "btnUpdate"
cpl.Controls.Add(btnUpdate)
我知道最纯粹的人会说你为什么不将按钮添加到网格的页脚而不是母版页中的附加内容占位符 - 好吧,我没有这样做。
无论如何,我将上面的代码移到了 CreateChildControls 可重写方法中,并且我还需要在我的 OnLoad 事件中额外调用 EnsureChildControls,所以我的 OnInit 方法重点瓦解了!@#%^* 为什么?好吧,在我对 "Rajan Chauhan" 的第二条评论中提到的这个网站上提出的另一个问题的答案中暗示了答案,我已经检查过了,显然每当你遍历控件集合时,你就会弄乱 ViewState (嘿,我只是重复另一个 post 中所说的内容,我对此事没有任何权限)在加载之前调用 Master.FindControl 在 OnInit 中是一个禁忌!
然而,由于我的 ItemTemplate 标记,我的 RowUpdated 事件并没有触发,因为我实际上是在视图模式下编辑的,所以我会坚持我所拥有的,因为我的 btnUpdate_Click 事件仍然像以前一样工作,即它执行了一些我在其他网站上找到的神奇代码,逐行检查数据更改,然后仅更新该特定行。好吧,我可以,因为最多只有 10 行,所以我不会使 ViewState 过载太多,如果知道我也使用分页很重要,所以实际上我有 10 多行,但不想像我想的那样提及这可能会增加混乱。