在GridView中使用多个DataKeyNames

8
我有一个GridView,它是通过ObjectDataSource填充的,并且在其DataKeyNames字段中有两个项目。其中一个是主键ID,另一个是类别字段(类别字段用于添加标题行以区分类别)。
显示正常,但我正在尝试创建删除操作。对象的删除方法仅需要ID字段,在ObjectDataSource中即使我将方法定义为仅需要ID字段,.net也会抱怨,因为它正在寻找具有DataKeyNames中定义的两个字段的方法。
如果我向删除方法添加类别参数,则可以工作,但是定义了一个未用于任何内容的参数很烦人。
我能否配置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>
4个回答

10

所有的DataKey值都会被传递到Delete方法,因为由DataKeyNames命名的字段旨在成为GridView中唯一标识该项的字段或字段。它们经常用于在ViewState中基于每行轻松地维护额外的字段,但这样做会产生您在ObjectDataSource方法中看到的副作用。

回答您最初的问题,不,如果Category在DataKeyNames中,则无法使其不被传递到Delete方法。但是,您可以通过将值放入模板列中的隐藏输入中,在ViewState中维护该值。虽然从Delete方法中忽略该参数比获取该值更麻烦,但这需要更多的工作。


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进行查找,但在我的更新过程中不需要它们。


1

我在使用对象数据源的GridView时遇到了同样的问题,我是这样处理的:我在SQL端使用了存储过程。我向存储过程中添加了一个多余的参数,尽管我并不需要该参数。这样做可以解决问题。


0

当使用默认的声明性删除方法时,GridView将同时向ObjectDataSource传递这两个值。

如果你真的不喜欢多余的参数,一个替代方法是取消声明性方法并使用自己的方法(你可以在那里删除不必要的参数),但这需要更多的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接