我有一个从ObjectDataSource填充的GridView,其DataKeyNames字段中有两个项目。一个是主键,ID,另一个是类别字段(类别字段用于添加标题行以描述类别)。
显示工作正常,但我正在尝试创建删除操作。对象的delete方法只需要ID字段,而在ObjectDataSource中,即使我将方法定义为只需要一个ID字段,.net也会抱怨,因为它正在寻找一个同时具有DataKeyNames中定义的字段的方法。
如果我将类别的参数添加到delete方法,它会起作用,但定义一个不用于任何内容的参数会很烦人。
我可以将ObjectDataSource和GridView对象配置为具有DataKeyNames的两个值,但是应该将哪些值传递给哪些方法?
两个对象的(简化)定义是:
<asp:ObjectDataSource ID="ObjDS1" runat="server" SelectMethod="getAllItems"
TypeName="Items" DeleteMethod="deleteItem">
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
<!-- This shouldn't be necessary: -->
<asp:Parameter Name="Category" Type="String" />
</DeleteParameters>
</asp:ObjectDataSource>
<asp:GridView ID="gvJItems" runat="server" AutoGenerateColumns="False" DataKeyNames="ID,Category"
DataSourceID="ObjDS1">
<Columns>
<asp:BoundField DataField="ID" Visible="false" HeaderText="ID" />
<asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="85%"/>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="lbDelete" Runat="server"
OnClientClick="return confirm('Are you sure you want to delete this?');"
CommandName="Delete">Delete</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
答案 0 :(得分:9)
所有DataKey值将始终传递给Delete方法,因为DataKeyNames命名的字段旨在成为GridView中唯一标识该项的字段。它们通常用于更多,以便在ViewState中逐行地轻松维护额外的字段,但这样做会产生您在ObjectDataSource方法中看到的副作用。
要回答您的原始问题,不,您不能将Data包含在DataKeyNames中而不将其传递给Delete方法。但是,您可以通过将值放在模板列中的隐藏输入中来维护ViewState中的值。但是,获取该值比忽略Delete方法的参数要多得多。
答案 1 :(得分:1)
我的gridview与对象数据源有同样的问题,我是如何处理这种情况的:我在SQL端使用StoredProcs。我在存储过程中添加了一个参数,但我不需要该参数。它运作良好
答案 2 :(得分:1)
您可以使用ObjectDataSource
更新/删除活动
void ODS_Updating(Object sender, ObjectDataSourceMethodEventArgs e)
{
e.InputParameters.Remove("Type_ID");
e.InputParameters.Remove("Document_ID");
e.InputParameters.Remove("State_ID");
}
我使用DataKeys
进行查找,但在更新过程中我不需要它们。
答案 3 :(得分:0)
使用默认声明性删除方法时,GridView会将两个值都传递给ObjectDataSource。
如果你真的不喜欢额外的参数,另一种方法是取消声明性方法并使用你自己的方法(你可以在那里删除不必要的参数),但它需要更多的代码。