【发布时间】:2015-07-07 07:41:13
【问题描述】:
我在绑定到 SQL 表的 ASP 页面上有一个 Gridview。我已经将网格配置为允许多次更新,方法是使用此处描述的方法将默认标签控件替换为 TemplateFields: Bulk Updates to Rows Bound to a GridView
一切正常,直到我做出更改以在页面加载时以编程方式绑定 Gridview 查询(目的是使 Gridview 根据当前查看页面的用户显示不同的数据),如下所述: Bind Gridview programmatically。 进行此更改后,当用户进行更改并单击更新按钮时,页面现在会引发以下错误:
GridView 'GridView1' 触发了未处理的事件 RowUpdating。
此外,当我尝试进行单行更新时,我收到此错误:
异常详细信息:System.Web.HttpException:GridView 'GridView1' 触发了未处理的事件 RowEditing。
我已经阅读了许多关于类似问题的主题,但我似乎无法找到解决我的错误的方法。我不知道为什么动态绑定 Gridview 会导致行更新错误。感谢任何支持以解决此问题。谢谢。
这是代码:
Public Class Input
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
gvbind()
End If
End Sub
Public Sub gvbind()
Dim SqlDataSource1 As New SqlDataSource()
SqlDataSource1.ID = "SqlDataSource1"
Me.Page.Controls.Add(SqlDataSource1)
SqlDataSource1.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
SqlDataSource1.SelectCommand = "SELECT [ID], [Project], [Description], [CAPEX], [Team] FROM [CAPEX]"
'Add Conditional Statements to change view for users/Teams
'SqlDataSource1.SelectCommand = "SELECT [ID], [Project], [Description], [CAPEX] FROM [CAPEX] where [Team] = 'Team1'"
GridView1.DataSource = SqlDataSource1
GridView1.DataBind()
End Sub
Private tableCopied As Boolean = False
Private originalDataTable As System.Data.DataTable
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
If Not tableCopied Then
originalDataTable = CType(e.Row.DataItem, System.Data.DataRowView).Row.Table.Copy()
ViewState("originalValuesDataTable") = originalDataTable
tableCopied = True
End If
End If
End Sub
Protected Sub Up_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Up.Click
originalDataTable = CType(ViewState("originalValuesDataTable"), System.Data.DataTable)
For Each r As GridViewRow In GridView1.Rows
If IsRowModified(r) Then GridView1.UpdateRow(r.RowIndex, False)
Next
' Rebind the Grid to repopulate the original values table.
tableCopied = False
GridView1.DataBind()
End Sub
Protected Function IsRowModified(ByVal r As GridViewRow) As Boolean
Dim currentID As Integer
Dim currentProject As String
Dim currentDescription As String
Dim currentCAPEX As String
currentID = Convert.ToInt32(GridView1.DataKeys(r.RowIndex).Value)
currentProject = CType(r.FindControl("ProjectTextBox"), TextBox).Text
currentDescription = CType(r.FindControl("DescriptionTextBox"), TextBox).Text
currentCAPEX = CType(r.FindControl("CAPEXTextBox"), TextBox).Text
Dim row As System.Data.DataRow = _
originalDataTable.Select(String.Format("ID = {0}", currentID))(0)
If Not currentProject.Equals(row("Project").ToString()) Then Return True
If Not currentDescription.Equals(row("Description").ToString()) Then Return True
If Not currentCAPEX.Equals(row("CAPEX").ToString()) Then Return True
Return False
End Function
这是标记:
<%@ Page Title="Input" Language="vb" MasterPageFile="~/Site.Master" AutoEventWireup="false"
CodeBehind="Input.aspx.vb" Inherits="WebApplication5.Input" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
Data Entry
</h2>
<p>
Enter Inputs Here<asp:TextBox runat="server" Text='<%# Bind ("Project") %>'
id="TextBox4"></asp:TextBox>
<asp:Table ID="Entry" runat="server">
</asp:Table>
<asp:Button ID="TestButton" runat="server" Text="Test" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
AllowSorting="True" AllowPaging="True" datakeynames = "ID" Width="502px">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ID" readOnly = "true" HeaderText="ID" SortExpression="ID"/>
<asp:TemplateField HeaderText="Project" SortExpression="Project">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Project") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="ProjectTextBox" runat="server" MaxLength="30"
Text='<%# Bind("Project") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Description" SortExpression="Description">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Description") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="DescriptionTextBox" runat="server" MaxLength="150"
Text='<%# Bind("Description") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="CAPEX" SortExpression="CAPEX">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("CAPEX") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:TextBox ID="CAPEXTextBox" runat="server" MaxLength="10"
Text='<%# Bind("CAPEX") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT [ID], [Project], [Description], [CAPEX] FROM [CAPEX]"
DeleteCommand="DELETE FROM [CAPEX] WHERE [ID] = @ID"
InsertCommand="INSERT INTO [CAPEX] ([ID], [Project], [Description], [CAPEX], [Team]) VALUES (@ID, @Project, @Description, @CAPEX, @Team)"
UpdateCommand="UPDATE [CAPEX] SET [Project] = @Project, [Description] = @Description, [CAPEX] = @CAPEX,[Team] = @Team WHERE [ID] = @ID">
<DeleteParameters>
<asp:Parameter Name="ID" Type="String" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="ID" Type="String" />
<asp:Parameter Name="Project" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="CAPEX" Type="Decimal" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Project" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="CAPEX" Type="Decimal" />
<asp:Parameter Name="ID" Type="String" />
<asp:Parameter Name="Team" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:Button ID="Up" runat="server" Text="Up" />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>
<asp:Table ID="Table1" runat="server" BorderWidth="1" BorderStyle="Solid">
</asp:Table>
</p>
【问题讨论】:
-
某事导致
RowUpdating和RowEditing被解雇,因此您需要在代码中处理它们。带有CommandName="Update"或CommandName="Edit"的按钮会做类似的事情。 the-gridview-fired-event-rowupdating-which-wasnt-handled-c-sharp-code-behi -
您不仅可以发布代码隐藏,还可以发布 asp 代码。
-
为了避免触发任何内置函数,我将按钮名称从“更新”更改为“向上”,但我仍然遇到问题。
-
我编辑帖子添加了asp代码,显然它还没有显示。有人告诉我,任何编辑都排在队列中,需要先获得批准才能显示....与此同时,这是我的 Gridview 部分代码
-
前面和后面的代码你还有SQLDatasource吗?如果您要转移到后面代码中的绑定,您肯定只需要一个吗?
标签: asp.net .net vb.net gridview