当前位置:编程学习 > C#/ASP.NET >>

如何将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;
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));
    }
}
--------------------编程问答-------------------- 参数只是一个桥梁,你定义了 original_UnitPrice,并不表示它会把原始数值存到里面去,你可以像 UnitPrice 一样,把它写到 GridView 中,只不过是 hidden 的。
当然我觉得更好的是做一个真正能唯一确定一条记录的主键,就不用再传那么多参数了。 --------------------编程问答-------------------- 只不过是 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进行绑定造成。 --------------------编程问答--------------------
引用 13 楼 pegtop 的回复:
模板列没有和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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,