2008-11-28 44 views
7

我有一個從ObjectDataSource填充的GridView,其DataKeyNames字段中有兩個項目。一個是主鍵ID,另一個是類別字段(類別字段用於添加標題行來描述類別)。GridView中的多個DataKeyNames

顯示工作正常,但我試圖創建一個刪除操作。即使我將該方法定義爲只需要一個ID字段,對象的delete方法也只需要ID字段,並且在ObjectDataSource中,.net會抱怨,因爲它正在尋找一種方法,該方法同時具有在DataKeyNames中定義的兩個字段。

它的工作原理是,如果我爲該類別添加一個參數到delete方法,但惱人的是有一個參數沒有用於任何東西。

我可以將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> 

回答

9

所有DataKey值將始終傳遞給Delete方法,因爲名稱爲DataKeyNames的字段旨在是唯一標識GridView中該項目的字段或字段。它們通常用於不止這些,以便在ViewState中以每行爲基礎輕鬆維護額外的字段,但這樣做會產生您在ObjectDataSource方法中看到的副作用。

要回答您的原始問題,請不要在DataKeyNames中將類別傳遞給Delete方法。不過,您可以通過將值置於模板列中的隱藏輸入中來維護ViewState中的值。不過,獲取該值的工作要比忽略Delete方法的參數要多得多。

0

當使用缺省聲明刪除方法,將GridView的兩個值傳遞到ObjectDataSource。

如果你真的不喜歡額外的參數,另一種方法是取消聲明方法並使用你自己的方法(你可以刪除不必要的參數),但它需要更多的代碼。

1

我與我的gridview有一個對象數據源相同的問題,我如何處理這種情況:我在SQL結束使用StoredProcs。我在存儲過程中增加了一個參數,但我不需要該參數。它工作得很好

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用於查找目的,但我並不需要他們在我的更新過程。