ObjectDataSource“ObjectDataSource1”未能找到带参数的非泛型方法

ObjectDataSource的使用的函数最好将变量名和数据库字段名统一,否则可能会出现错误虽然有解决办法,但没必要浪费时间去玩那个,不就是变量名吗,无所谓的啦。如果需要使用ObjectDataSource控件的更新和删除功能,一般是根据主键进行修改的,但是我在使用这个功能的时候,由于把主键这个字段设置为了readonly(主键不能更新),结果传回去的时候主键值就没有了,后来想了个办法,用cookieparam作为主键的来源,在gridview或者detailsview控件更新、删除之前(响应事件)将主键值写入cookie,感觉有点笨,不过功能没什么问题。

我发现自己真的很笨耶,晕死了。想要取回主键ID值,不用cookie那么麻烦去做,虽然可以实现功能,但肯定不好。
下面的方法应该才是正确的方法:
   指定GridView或者DetailsView的 DataKeyNames 属性,比如你的主键ID是ID,则指定DataKeyNames"ID"
在objectdatasource或者其他数据源控件指定参数,如下:

这样就可以传过去了
下面是我的一些代码:
DetailsView :
       

<yyc:SmartGridView ID="SmartGridView1" runat="server" AllowPaging="True" DataKeyNames="UserName"  DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" AutoGenerateDeleteButton="True">
        <Columns>
        <asp:BoundField DataField="UserName" HeaderText="用户名" SortExpression="UserName" ReadOnly="True"/>
        <asp:BoundField DataField="Email" HeaderText="邮箱" SortExpression="Email"/>
        <asp:BoundField DataField="PasswordQuestion" HeaderText="问题" SortExpression="PasswordQuestion" />
        <asp:BoundField DataField="Comment" HeaderText="回答" SortExpression="Comment" />
        <asp:BoundField DataField="IsApproved" HeaderText="是否启用" SortExpression="IsApproved" />
        <asp:BoundField DataField="CreateDate" HeaderText="创建时间" SortExpression="CreateDate" />
        <asp:BoundField DataField="LastLoginDate" HeaderText="上次登录时间" SortExpression="LastLoginDate" />
        <asp:BoundField DataField="LastActivityDate" HeaderText="上次激活时间" SortExpression="LastActivityDate" />
        <asp:BoundField DataField="LastPasswordChangedDate" HeaderText="上次变更密码时间" SortExpression="LastPasswordChangedDate" />
        <asp:BoundField DataField="UserId" HeaderText="用户ID" SortExpression="UserId" />
        <asp:BoundField DataField="IsLockedOut" HeaderText="是否锁定" SortExpression="IsLockedOut" />
        <asp:BoundField DataField="LastLockoutDate" HeaderText="解除锁定时间" SortExpression="LastLockoutDate" />
        <asp:CommandField ShowDeleteButton="True" ButtonType="Button"/>
    </Columns>
</yyc:SmartGridView>

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUsers" TypeName="UsersManager" DeleteMethod="DelUser">
       <DeleteParameters>
           <asp:Parameter Name="UserName" Type="String" />
       </DeleteParameters>
   </asp:ObjectDataSource>

业务层代码: 

[DataObjectMethod(DataObjectMethodType.Delete, true)]
public bool DelUser(string UserName)
{
    return Membership.DeleteUser(UserName);
}

原文地址:https://www.cnblogs.com/noahsky/p/1114635.html