2008-11-28 29 views
7

Tôi có một GridView được điền từ một ObjectDataSource với hai mục trong trường DataKeyNames của nó. Một là khóa chính, ID, trường còn lại là trường danh mục (trường danh mục được sử dụng để thêm hàng tiêu đề để phân định các danh mục).Nhiều DataKeyNames trong GridView

Hiển thị hoạt động tốt, nhưng tôi đang cố tạo hành động Xóa. Phương thức xóa của đối tượng chỉ cần trường ID và trong ObjectDataSource ngay cả khi tôi định nghĩa phương thức như chỉ cần một trường ID, .net than phiền vì nó đang tìm kiếm một phương thức có cả hai trường được định nghĩa trong DataKeyNames.

Tính năng này hoạt động nếu tôi thêm thông số cho danh mục vào phương thức xóa, nhưng thật khó chịu khi có thông số được xác định không được sử dụng cho bất kỳ thứ gì.

Tôi có thể định cấu hình các đối tượng ObjectDataSource và GridView để có hai giá trị cho DataKeyNames nhưng cụ thể sẽ được chuyển cho phương thức nào?

The (giản thể) định nghĩa cho hai đối tượng là:

<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> 

Trả lời

9

Tất cả giá trị DataKey sẽ luôn được chuyển đến phương thức Xóa vì các trường có tên là DataKeyNames được dự định là trường hoặc trường xác định duy nhất mục đó trong GridView. Chúng thường được sử dụng nhiều hơn thế để dễ dàng duy trì các trường bổ sung trên cơ sở mỗi hàng trong ViewState như bạn đang ở đây, nhưng làm như vậy có tác dụng phụ mà bạn đang thấy với các phương thức ObjectDataSource.

Để trả lời câu hỏi ban đầu của bạn, không, bạn không thể có Danh mục trong DataKeyNames mà không được chuyển đến phương thức Xóa. Bạn có thể duy trì giá trị trong ViewState bằng cách đặt giá trị vào đầu vào bị ẩn trong Cột mẫu của bạn. Nó sẽ được nhiều công việc để có được giá trị đó hơn là bỏ qua các tham số cho phương pháp Delete, mặc dù.

0

Khi sử dụng mặc định declarative xóa phương pháp, GridView sẽ vượt qua cả hai giá trị để ObjectDataSource.

Nếu bạn thực sự không thích tham số bổ sung, cách khác là hủy phương thức khai báo và sử dụng phương thức khai báo của riêng bạn (bạn có thể xóa tham số không cần thiết ở đó), nhưng yêu cầu mã nhiều hơn.

1

Tôi đã gặp vấn đề tương tự với GridView của mình với nguồn dữ liệu đối tượng, cách tôi xử lý tình huống này: Tôi sử dụng StoredProcs ở cuối SQL. Tôi đã thêm một tham số nữa vào thủ tục lưu trữ, mặc dù tôi không cần tham số đó. Nó hoạt động tốt

1

Bạn có thể loại bỏ chúng bằng cách sử dụng ObjectDataSource cập nhật/xóa các sự kiện

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

Tôi đang sử dụng cho các mục đích DataKeys nhìn lên nhưng tôi không cần đến chúng trong thủ tục cập nhật của tôi.

Các vấn đề liên quan