Ich habe ein GridView von einer ObjectDataSource mit zwei Elementen in seinem DataKeyNames-Feld aufgefüllt. Einer ist der Primärschlüssel, ID, der andere ist ein Kategoriefeld (das Kategoriefeld wird zum Hinzufügen von Kopfzeilen zum Abgrenzen von Kategorien verwendet).Mehrere DataKeyNames in einer GridView
Anzeige funktioniert gut, aber ich versuche eine Löschaktion zu erstellen. Die delete-Methode des Objekts benötigt nur das ID-Feld und in der ObjectDataSource, selbst wenn ich die Methode so definiere, dass sie nur ein ID-Feld benötigt, beschwert sich .net, weil es nach einer Methode sucht, die beide in DataKeyNames definierten Felder enthält.
Es funktioniert, wenn ich einen Parameter für die Kategorie der Löschmethode hinzufügen, aber es ist ärgerlich, einen Parameter zu definieren, der für nichts verwendet wird.
Kann ich die ObjectDataSource- und GridView-Objekte so konfigurieren, dass sie zwei Werte für DataKeyNames haben, aber welche würden an welche Methoden übergeben werden?
Die (vereinfachten) Definitionen für die beiden Objekte sind:
<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>