如何将Gridview编辑状态中的控件的OldValue传递给ObjectDataSource的UpdateParameters?
如何将Gridview编辑状态中的控件的OldValue传递给ObjectDataSource的UpdateParameters?我已经定义了ObjectDataSource的OldValuesParameterFormatString = "original_{0}" ,但是发现实际传出去的时候只有
Gridview.DataKeyNames="OrderId" 中设置的OrderId才有original_OrderId数值,其他数值都是0.
使用的数据库是 Northwind 的 Order Details 表。
注意 ObjectDataSource 的 UpdateMethod="AddDraftDetail" 属性设置,我在 AddDraftDetail 方法中设置了Debug,发现只要将字段设置为 DataKeyNames 就能获取其 original_{0} value,否则获取的都是 0
以下是ASPX的全部代码。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddOrders.aspx.cs" Inherits="AddOrders" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView2" runat="server" AllowPaging="True"
AutoGenerateColumns="False" AutoGenerateSelectButton="True"
DataKeyNames="OrderID" DataSourceID="SqlDataSource1"
PageSize="5">
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False"
ReadOnly="True" SortExpression="OrderID" />
<asp:BoundField DataField="ShipName" HeaderText="ShipName"
SortExpression="ShipName" />
<asp:BoundField DataField="ShipAddress" HeaderText="ShipAddress"
SortExpression="ShipAddress" />
<asp:BoundField DataField="ShipCity" HeaderText="ShipCity"
SortExpression="ShipCity" />
<asp:BoundField DataField="ShipRegion" HeaderText="ShipRegion"
SortExpression="ShipRegion" />
<asp:BoundField DataField="ShipPostalCode" HeaderText="ShipPostalCode"
SortExpression="ShipPostalCode" />
<asp:BoundField DataField="ShipCountry" HeaderText="ShipCountry"
SortExpression="ShipCountry" />
</Columns>
</asp:GridView>
</div>
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"
AutoGenerateEditButton="True" AutoGenerateColumns="False"
DataKeyNames="OrderId,ProductId" onrowupdating="GridView1_RowUpdating"
>
<Columns>
<asp:TemplateField HeaderText="Product" >
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="sds3"
DataTextField="ProductName" DataValueField="ProductID" SelectedValue='<%# Bind("ProductId") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="sds3" runat="server"
ConnectionString="<%$ ConnectionStrings:northwindConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName] + cast(productid as varchar(10)) as ProductName FROM [Products]">
</asp:SqlDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="OrderId" HeaderText="OrderId" ReadOnly="True" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" />
<asp:BoundField DataField="Quantity" HeaderText="Quantity" />
<asp:BoundField DataField="Discount" HeaderText="Discount" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:northwindConnectionString %>"
SelectCommand="SELECT * FROM [Orders]"></asp:SqlDataSource>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString = "original_{0}" EnableViewState="true" EnableCaching ="true"
SelectMethod="GetDraftDetails" TypeName="Order" UpdateMethod="AddDraftDetail">
<UpdateParameters>
<%--注意我在这里定义的参数列表,定义了9个,但是实际传出去的参数却只有 5个,分别是 UnitPrice Quantity Discount ProductId original_OrderId,这是为什么?--%>
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Quantity" Type="Int32" />
<asp:Parameter Name="Discount" Type="Single" />
<asp:Parameter Name="ProductId" Type="Int32" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Quantity" Type="Int32" />
<asp:Parameter Name="original_Discount" Type="Single" />
<asp:Parameter Name="original_OrderId" Type="Int32" />
<asp:Parameter Name="original_ProductId" Type="Int32" />
</UpdateParameters>
<SelectParameters>
<asp:ControlParameter ControlID="GridView2" DefaultValue="0"
Name="OrderId" PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
</form>
</body>
</html>
以下是 Order.cs 类的全部代码
using System;--------------------编程问答-------------------- 参数只是一个桥梁,你定义了 original_UnitPrice,并不表示它会把原始数值存到里面去,你可以像 UnitPrice 一样,把它写到 GridView 中,只不过是 hidden 的。
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Diagnostics;
/// <summary>
///Order 的摘要说明
/// </summary>
public class Order
{
public Order()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public bool AddDraftDetail(decimal UnitPrice, int Quantity, float Discount, int Productid, decimal original_UnitPrice, int original_Quantity, float original_Discount, int original_OrderId, int original_Productid)
{
Debug.Print(original_UnitPrice.ToString());
Debug.Print(original_Quantity.ToString());
Debug.Print(original_Discount.ToString());
Debug.Print(original_Productid.ToString());
return SqlComm.SQLExecute("update [Order Details] set productid =@productid,unitprice = @unitprice ,quantity = @quantity ,discount =@discount where orderid = @original_orderid and productId=@original_productid",
new SqlParameter("unitprice", UnitPrice),
new SqlParameter("quantity", Quantity),
new SqlParameter("Discount", Discount),
new SqlParameter("Productid", Productid),
new SqlParameter("original_orderid", original_OrderId),
new SqlParameter("original_productid", original_Productid));
}
public DataSet GetDraftDetails(int OrderId)
{
//throw new System.NotImplementedException();
return SqlComm.DataSetSQLExecute("select ods.*,p.productname from [Order Details] ods inner join products p on ods.productid = p.productid where orderid=@orderid", new SqlParameter("orderid", OrderId));
}
}
当然我觉得更好的是做一个真正能唯一确定一条记录的主键,就不用再传那么多参数了。 --------------------编程问答-------------------- 只不过是 hidden 的。 --------我已经试验过用 HIDDEN控件来存放,但是并不自动传递给ObjectDataSource控件,如果要编程手动传,我就根本不用ObjectDataSource了。
做一个真正能唯一确定一条记录的主键-------我的目的不是唯一确定主键,只要要获取所有控件的OldValue传递给我自己的类的方法。难道这都要手动的么?那么我定义ObjectDataSource的UPdate参数还有什么意义呢? --------------------编程问答-------------------- up --------------------编程问答-------------------- 你可以在GridView的RowUpdating中通过 e.OldValues 获得值,再在 ObjectDataSource的Updating中向 e.InputParameters ["xxx"] 中写入,从而改变参数值。 --------------------编程问答-------------------- 一个知识点是如何获得GridView的oldvalues,一个是知识点是如何在调用UpdateMethod对应的方法之前修改参数值,这两个都比较简单,可能你看到的Asp.net编程教材比较古老连这两个基本点都没有想到。 --------------------编程问答-------------------- 这是指你非常灵活地自定义Update方法的参数的情况。
如果你使用设计器自动生成的,你无需手动编程,它也可以生成在参数中同时有新值和旧值的调用。可以参考: Scott Mitchell 的ASP.NET 2.0数据教程之50:对SqlDataSource控件使用开放式并发 --------------------编程问答-------------------- 你可以在GridView的RowUpdating中通过 e.OldValues 获得值,再在 ObjectDataSource的Updating中向 e.InputParameters ["xxx"] 中写入,从而改变参数值。
-----------不是很清楚,既然可以直接在 aspx页面中生成参数,干吗还要手动去写?用 ObjectDataSource 的目的是不要手动去编程。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString = "original_{0}" EnableViewState="true" EnableCaching ="true"
SelectMethod="GetDraftDetails" TypeName="Order" UpdateMethod="AddDraftDetail">
<UpdateParameters>
<%--注意我在这里定义的参数列表,定义了9个,但是实际传出去的参数却只有 5个,分别是 UnitPrice Quantity Discount ProductId original_OrderId,这是为什么?--%>
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Quantity" Type="Int32" />
<asp:Parameter Name="Discount" Type="Single" />
<asp:Parameter Name="ProductId" Type="Int32" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Quantity" Type="Int32" />
<asp:Parameter Name="original_Discount" Type="Single" />
<asp:Parameter Name="original_OrderId" Type="Int32" />
<asp:Parameter Name="original_ProductId" Type="Int32" />
</UpdateParameters>
能帮忙看一下我上面的配置么?明明已经配置了参数,为什么在 AddDraftDetail 方法中却无法得到?
--------------------编程问答-------------------- up --------------------编程问答-------------------- 未解决 --------------------编程问答-------------------- up --------------------编程问答-------------------- 继续 UP --------------------编程问答-------------------- 天那!这么多眩目的勋章!
好像为将军提问似的。我这小兵没回答心先颤哦。
--------------------编程问答-------------------- 模板列没有和datafield进行绑定造成。 --------------------编程问答--------------------
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="OrderID" InsertVisible="False"
ReadOnly="True" SortExpression="OrderID" />
<asp:BoundField DataField="ShipName" HeaderText="ShipName"
SortExpression="ShipName" />
<asp:BoundField DataField="ShipAddress" HeaderText="ShipAddress"
SortExpression="ShipAddress" />
<asp:BoundField DataField="ShipCity" HeaderText="ShipCity"
SortExpression="ShipCity" />
<asp:BoundField DataField="ShipRegion" HeaderText="ShipRegion"
SortExpression="ShipRegion" />
<asp:BoundField DataField="ShipPostalCode" HeaderText="ShipPostalCode"
SortExpression="ShipPostalCode" />
<asp:BoundField DataField="ShipCountry" HeaderText="ShipCountry"
SortExpression="ShipCountry" />
</Columns>
补充:.NET技术 , ASP.NET