2008-11-28 4 views
7

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> 

Antwort

9

Alle DataKey-Werte werden immer an die Delete-Methode übergeben, da die Felder DataKeyNames das Feld oder die Felder sein sollen, die dieses Element in der GridView eindeutig identifizieren. Sie werden oft für mehr als das verwendet, um zusätzliche Felder in ViewState auf einer Zeile zu verwalten, so wie Sie hier sind, aber dies hat den Nebeneffekt, den Sie mit den ObjectDataSource-Methoden sehen.

Um Ihre ursprüngliche Frage zu beantworten, nein, Sie können keine Kategorie in DataKeyNames haben, ohne dass es an die Delete-Methode übergeben wird. Sie können den Wert in ViewState beibehalten, indem Sie den Wert in eine ausgeblendete Eingabe in Ihrer Vorlagenspalte einfügen. Es wäre mehr Arbeit, diesen Wert zu erhalten, als den Parameter für die Delete-Methode zu ignorieren.

0

Wenn die Standardmethode deklarative löschen Verwendung Grid beide Werte auf der Object passieren.

Wenn Sie den zusätzlichen Parameter wirklich nicht mögen, ist eine Alternative, die deklarative Methode abzubrechen und Ihre eigene zu verwenden (Sie können den unnötigen Parameter dort entfernen), aber es erfordert mehr Code.

1

Ich hatte das gleiche Problem mit meinem Gridview mit einem Objekt Datenquelle, wie ich diese Situation behandelt: Ich verwende StoredProcs in der SQL-Ende. Ich fügte einen weiteren Parameter in die Speicherprozedur ein, obwohl ich diesen Parameter nicht benötigte. Es funktionierte gut

1

Sie sie entfernen können die ObjectDataSource Aktualisierung mit/Löschen des Ereignisses

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

Ich verwende die DataKeys für Look-up-Zwecke, aber ich brauche sie nicht in meinem Update-Vorgang.

Verwandte Themen