ObjectDataSource用法之五(更新)

1. 准備條件

參考:ObjectDataSource用法之一(SelectMethod來進行簡單的邦定)

2. 在業務處理類中添加如下方法

public void UpdateItem(string old_UID,string old_Email, string UID, string PWD, string Email)
{
    HttpContext.Current.Response.Write("old_UID = " + old_UID + "<br/>");
    HttpContext.Current.Response.Write("old_Email = " + old_Email + "<br/>");
    HttpContext.Current.Response.Write("UID = " + UID + "<br/>");
    HttpContext.Current.Response.Write("PWD = " + PWD + "<br/>");
    HttpContext.Current.Response.Write("Email = " + Email + "<br/>");
}

3. aspx頁面內容為

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="AllItems" TypeName="Member"
UpdateMethod="UpdateItem" OldValuesParameterFormatString="old_{0}">
        <UpdateParameters>
            <asp:Parameter Name="old_UID" />
            <asp:Parameter Name="old_Email" />
        </UpdateParameters>
    </asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="true"
    DataSourceID="ObjectDataSource1" DataKeyNames="UID,Email">
    <Columns>
        <asp:BoundField DataField="UID" HeaderText="UID" SortExpression="UID" />
        <asp:BoundField DataField="PWD" HeaderText="PWD" SortExpression="PWD" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
    </Columns>
</asp:GridView>

4. 說明:

UpdateMethod:指定的是業務處理類中的更新操作的方法名稱
OldValuesParameterFormatString:表示給UpdateMethod指定的更新方法傳遞參數,其格式為:一個字符串但這個字符串中必須有{0}字樣。這里的{0}將會有邦定控件的DataKeyNames屬性指定的值來填充了, 當DataKeyNames有多個值時,我們需要在UpdateParameters集合中添加多個參數了,這里的參數名稱為OldValuesParameterFormatString指定的字符串將其它的{0}換成DataKeyNames中的值,這個參數的作用是:傳遞記錄的主鍵和一些唯一欄位的值. 它所記錄的是更新前的數據了...如上...

從上面我們可以看到UpdateItem方法有5個參數了,而我們通過UpdateParameters只指定了二個參數,還有三個參數怎麼來的呢?這三個參數是Gridview中可編輯欄位的值了.這里怎麼理解呢?我們將上面的代碼改寫成如下:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="AllItems" TypeName="Member" UpdateMethod="UpdateItem" OldValuesParameterFormatString="old_{0}">
        <UpdateParameters>
            <asp:Parameter Name="old_UID" />
            <asp:Parameter Name="old_Email" />
        </UpdateParameters>
    </asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" AutoGenerateEditButton="true"
    DataSourceID="ObjectDataSource1" DataKeyNames="UID,Email">
    <Columns>
        <asp:BoundField DataField="UID" HeaderText="UID" ReadOnly="true" SortExpression="UID" />
        <asp:BoundField DataField="PWD" HeaderText="PWD" SortExpression="PWD" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
    </Columns>
</asp:GridView>

注意我們將UID欄位設為了不可編輯的..那麼這個時候還使用上面有五個參數的UpdateItem方法就會出錯了...改應該使用public void UpdateItem(string old_UID,string old_Email,string PWD, string Email)四個參數的方法了,還有一點要註意的就是這里的PWD,Email參數的名稱對應為GridView中的DataField名稱......

當然我們也可以將以上代碼改寫成如下也是一樣的效果

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="AllItems" TypeName="Member" UpdateMethod="UpdateItem" OldValuesParameterFormatString="old_{0}">
        <UpdateParameters>
            <asp:Parameter Name="old_UID" />
            <asp:Parameter Name="old_Email" />
            <asp:Parameter Name="UID" />
            <asp:Parameter Name="PWD" />
            <asp:Parameter Name="Email" />
        </UpdateParameters>
    </asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" AutoGenerateEditButton="true"
    DataSourceID="ObjectDataSource1" DataKeyNames="UID,Email">
    <Columns>
        <asp:BoundField DataField="UID" HeaderText="UID"  SortExpression="UID" />
        <asp:BoundField DataField="PWD" HeaderText="PWD" SortExpression="PWD" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
    </Columns>
</asp:GridView>

以上這個代碼才是全稱,上面的只是默認的....

如果更新方法UpdateItem還多了一些不是在GridView中編輯的參數(如更新日期,更新人等)
public void UpdateItem(string old_UID, string old_Email, string UID, string PWD, string Email, string UpdateDate, string Updater)
怎麼辦呢?

我們也可以通過程式來給UpateParameters賦參數

ObjectDataSource1.UpdateParameters.Add("UpdateDate", DateTime.Now.ToShortDateString());
ObjectDataSource1.UpdateParameters.Add("Updater", "limin");



<圖一>



<圖二>

另外ObjectDataSuorce的parameter(参数设置),如果在GridView上有相应的列,不用显示声明,ObjectDataSuorce会自动将GridView上存在的可编辑的数据列(更新的时候是<%#Bind("的字段")%>,查询的时候是<%#Eval("的字段")%>)自动生成Parameter参数,另外parameter的名称与实体对象的属性、后台DAL或BLL层函数的参数匹配是不区分大小写的,但是有一个特例是如果GridView有DataKeyName字段,则ObjectDataSuorce的update的各个parameter里面不允许出现与DataKeyName名称且大小写完全相同的parameter,否者ObjectDataSuorce会说找不到后台匹配更新函数

原文地址:https://www.cnblogs.com/OpenCoder/p/1567725.html