Mehrere DataKeyNames in einem GridView
Ich habe ein GridView-bevölkert von einer ObjectDataSource mit zwei Elemente in der DataKeyNames-Feld. Einer ist der primäre Schlüssel, die ID, das andere ist ein Kategorie Feld (das Feld "Kategorie" wird verwendet, um header-Zeilen als Trennzeichen zwischen den Kategorien).
Anzeige funktioniert gut, aber ich bin versuchen, um eine Löschen-Aktion. Das Objekt die delete-Methode muss nur das Feld " ID " und in das ObjectDataSource-auch wenn ich die Methode bestimmen, wie brauchen nur ein ID-Feld .net beschwert, denn er ist auf der Suche nach einer Methode, die sowohl die definierten Felder DataKeyNames.
Es funktioniert, wenn ich einen parameter für die Kategorie zu der die delete-Methode, aber es ist ärgerlich, haben einen parameter definiert, die nicht für alles verwendet.
Kann ich konfigurieren das ObjectDataSource-und GridView-Objekte haben zwei Werte für die DataKeyNames-aber bestimmte, die würde übergeben werden sollen, welche Methoden?
Die (vereinfachte) 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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle DataKey-Werte werden immer übergeben werden, um die Delete-Methode, weil die Felder mit den Namen von DataKeyNames werden sollen, das Feld oder die Felder, die eindeutig identifiziert das Element in der GridView. Sie sind oft für mehr als das, um leicht zu pflegen, zusätzliche Felder, die auf einer pro-Zeilen-basis in ViewState, wie Sie hier sind, hat aber auch den Nebeneffekt, dass Sie sehen, mit der ObjectDataSource Methoden.
Beantworten Ihre ursprüngliche Frage, Nein, man kann keine Kategorie in der DataKeyNames-zimmerreserviereung, ohne das Sie es übergeben werden, um die Delete-Methode. Sie pflegen konnte der Wert im ViewState, indem Sie den Wert in einem hidden-input in Ihre Spalte Vorlage, obwohl. Es würde mehr Arbeit zu bekommen, dass der Wert sich als zu ignorieren den parameter der Methode Delete, obwohl.
Ich hatte das gleiche problem mit meinem gridview mit einem datasource-Objekt, wie ich behandelt diese situation : ich benutze StoredProcs in der SQL-Ende. Ich fügte einen weiteren parameter in der gespeicherten Prozedur, wenn ich nicht benötigen diesen parameter. Es funktionierte gut
Können Sie entfernen Sie Sie mit der
ObjectDataSource
aktualisieren/löschen der VeranstaltungIch bin mit der
DataKeys
für look-up-Zwecke, aber ich brauche Sie in meinem update-Prozedur.Wenn Sie die standardmäßige deklarativen delete-Methode, GridView übergeben wird, beide Werte auf die ObjectDataSource.
Wenn Sie wirklich nicht, wie die zusätzlichen parameter, der eine alternative ist zu kündigen, die deklarative Methode, und verwenden Sie Ihre eigenen (Sie können entfernen Sie die unnötigen parameter gibt), aber es erfordert mehr code.