【问题标题】:Multiple DataKeyNames in a GridViewGridView 中的多个 DataKeyNames
【发布时间】:2008-11-28 17:07:17
【问题描述】:

我有一个从 ObjectDataSource 填充的 GridView,它的 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>

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    所有 DataKey 值将始终传递给 Delete 方法,因为 DataKeyNames 命名的字段旨在成为唯一标识 GridView 中该项目的一个或多个字段。它们的用途通常不止于此,以便在 ViewState 中按行轻松维护额外的字段,就像您在这里一样,但这样做会产生您在使用 ObjectDataSource 方法时看到的副作用。

    要回答您的原始问题,不,您不能将 Category 放在 DataKeyNames 中,而无需将其传递给 Delete 方法。不过,您可以通过将值放在模板列中的隐藏输入中来维护 ViewState 中的值。不过,与忽略 Delete 方法的参数相比,获取该值需要更多的工作。

    【讨论】:

      【解决方案2】:

      我的 gridview 与对象数据源有同样的问题,我是如何处理这种情况的:我在 SQL 端使用 StoredProcs。我在存储过程中又添加了一个参数,虽然我不需要那个参数。效果很好

      【讨论】:

        【解决方案3】:

        您可以使用 ObjectDataSource 更新/删除事件来删除它们

        void ODS_Updating(Object sender, ObjectDataSourceMethodEventArgs e)
        {
          e.InputParameters.Remove("Type_ID");
          e.InputParameters.Remove("Document_ID");
          e.InputParameters.Remove("State_ID");
        }
        

        我将DataKeys 用于查找目的,但在我的更新过程中不需要它们。

        【讨论】:

          【解决方案4】:

          当使用默认的声明式删除方法时,GridView 会将这两个值都传递给 ObjectDataSource。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-19
            • 1970-01-01
            • 2015-07-30
            • 1970-01-01
            • 2011-10-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多