8

ObjectDataSourceからDataKeyNamesフィールドに2つの項目を入力したGridViewがあります。1つは主キーIDで、もう1つはカテゴリフィールドです(カテゴリフィールドは、カテゴリを表すヘッダー行を追加するために使用されます)。

表示は正常に機能しますが、削除アクションを作成しようとしています。オブジェクトのdeleteメソッドはIDフィールドのみを必要とし、ObjectDataSourceでメソッドをIDフィールドのみが必要であると定義した場合でも、.netはDataKeyNamesで定義された両方のフィールドを持つメソッドを探しているため文句を言います。

カテゴリのパラメータをdeleteメソッドに追加すると機能しますが、何にも使用されないパラメータを定義するのは面倒です。

ObjectDataSourceオブジェクトとGridViewオブジェクトをDataKeyNamesの2つの値を持つように構成できますが、どちらをどのメソッドに渡すかを指定できますか?

2つのオブジェクトの(簡略化された)定義は次のとおりです。

<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

4 に答える 4

10

DataKeyNamesで指定されたフィールドは、GridViewでそのアイテムを一意に識別する1つまたは複数のフィールドであることが意図されているため、すべてのDataKey値は常にDeleteメソッドに渡されます。これらは、ここにあるようにViewStateで行ごとに追加のフィールドを簡単に維持するためにそれ以上に使用されることがよくありますが、そうすると、ObjectDataSourceメソッドで見られる副作用があります。

元の質問に答えるには、いいえ、Deleteメソッドに渡さずにCategoryをDataKeyNamesに含めることはできません。ただし、テンプレート列の非表示の入力に値を配置することで、ViewStateの値を維持できます。ただし、Deleteメソッドのパラメーターを無視するよりも、その値を取得する方が作業が多くなります。

于 2008-11-28T20:43:00.747 に答える
1

オブジェクトデータソースを使用したグリッドビューでも同じ問題が発生しました。この状況をどのように処理したかです。SQL側でStoredProcsを使用しています。そのパラメーターは必要ありませんでしたが、ストアード・プロシージャーにもう1つのパラメーターを追加しました。それはうまくいきました

于 2011-11-18T14:37:11.450 に答える
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検索目的で を使用していますが、更新手順では必要ありません。

于 2012-02-02T17:36:36.913 に答える
0

既定の宣言型の削除メソッドを使用する場合、GridView は両方の値を ObjectDataSource に渡します。

余分なパラメーターが本当に気に入らない場合は、代わりに宣言型メソッドをキャンセルして独自のメソッドを使用することもできますが (不要なパラメーターを削除できます)、より多くのコードが必要になります。

于 2008-11-28T17:30:12.383 に答える