2008-11-28 40 views
7

Tengo un GridView poblado de un ObjectDataSource con dos elementos en su campo DataKeyNames. Uno es la clave principal, ID, el otro es un campo de categoría (el campo de categoría se usa para agregar filas de encabezado para delinear categorías).Multiple DataKeyNames en un GridView

La visualización funciona bien, pero estoy intentando crear una acción Eliminar. El método de eliminación del objeto solo necesita el campo ID y en ObjectDataSource incluso si defino que el método solo necesita un campo de ID, .net se queja porque está buscando un método que tenga ambos campos definidos en DataKeyNames.

Funciona si agrego un parámetro para la categoría al método de eliminación, pero es molesto tener un parámetro definido que no se usa para nada.

¿Puedo configurar los objetos ObjectDataSource y GridView para tener dos valores para DataKeyNames pero específicos que deberían pasarse a qué métodos?

Los (simplificado) definiciones de los dos objetos son:

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

Respuesta

9

Todos los valores de DataKey siempre se pasarán al método Eliminar porque los campos nombrados por DataKeyNames están destinados a ser el campo o campos que identifican de manera única ese elemento en el GridView. A menudo se utilizan para más de eso para mantener fácilmente campos adicionales por fila en ViewState como está aquí, pero hacerlo tiene el efecto secundario que está viendo con los métodos de ObjectDataSource.

Para responder a su pregunta original, no, no puede hacer que Categoría esté en DataKeyNames sin tener que pasarse al método Eliminar. Sin embargo, puede mantener el valor en ViewState poniendo el valor en una entrada oculta en su columna de plantilla. Sin embargo, sería más trabajo obtener ese valor que ignorar el parámetro del método Delete.

0

Cuando se utiliza el valor por defecto declarativa borrar método, GridView pasará ambos valores a la ObjectDataSource.

Si realmente no le gusta el parámetro adicional, una alternativa es cancelar el método declarativo y utilizar el suyo propio (puede eliminar el parámetro innecesario allí), pero requiere más código.

1

Tuve el mismo problema con mi gridview con un origen de datos objeto, cómo manejé esta situación: uso StoredProcs en el extremo SQL. Agregué un parámetro más en el procedimiento de la tienda, aunque no necesitaba ese parámetro. Funcionó bien

1

Puede eliminarlos mediante la actualización ObjectDataSource/borrar el evento

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

estoy usando los DataKeys con fines de consulta, pero yo no los necesito en mi proceso de actualización.