asp.net - multiple - MĂșltiples DataKeyNames en una GridView
datakeynames gridview c# multiple (4)
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).
Mostrar funciona bien, pero estoy tratando de 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?
Las definiciones (simplificadas) para 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>
Al usar el método de eliminación declarativa predeterminado, GridView pasará ambos valores a ObjectDataSource.
Si realmente no te gusta el parámetro adicional, una alternativa es cancelar el método declarativo y usar el tuyo propio (puedes eliminar el parámetro innecesario allí), pero requiere más código.
Puede eliminarlos utilizando ObjectDataSource
actualizando / eliminando 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 las DataKeys
para fines de búsqueda, pero no las necesito en mi procedimiento de actualización.
Todos los valores de DataKey siempre se pasarán al método Delete porque los campos nombrados por DataKeyNames están destinados a ser el campo o los 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 al 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 que se pase 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.
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