ejemplos - datagrid wpf ejemplo
WPF datagrid seleccionó el evento cliqueado en la fila? (5)
¿Por qué no obtiene la propiedad SelectedRow mientras ocurre el evento de DoubleClick y hace algo con él? Si SelectedRow es nulo, significa que no se seleccionó ninguna fila, solo regrese
private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
if(grid.SelectedRow == null)
return; // return if there''s no row selected
// do something with the Selected row here
}
Quiero ejecutar algún código cuando se hace doble clic en una fila seleccionada de WPF DataGrid. Sé que la cuadrícula de datos tiene un evento MouseDoubleClicked y que también tiene un evento seleccionado en la fila, pero no veo ningún evento para "la fila seleccionada hace doble clic" ...
¿Crees que es posible capturar este evento de alguna manera?
El ItemContainerStyle
no tiene la mejor solución, sugiera utilizar RowStyle
:
En tu XAML:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.RowStyle>
En tu código:
private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//your logic here
}
Esta pregunta surgió mientras buscaba una solución y las respuestas no funcionaron, ya sea por la edad o por mi propia implementación. De cualquier manera, aquí está la solución que funcionó para mí.
Agregue el evento MouseDoubleClick a DataGrid
<DataGrid x:Name="DatagridMovie"
Width="Auto"
CanUserAddRows="False"
CanUserDeleteRows="True"
IsReadOnly="true"
ItemsSource="{Binding}"
MouseDoubleClick="Row_MouseDoubleClick">
y en el método
private void Row_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Ensure row was clicked and not empty space
DataGridRow row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow;
if ( row == null ) return;
...
Stuff();
}
Hasta ahora no he notado ningún problema con eso. No comparte el problema que otros tienen que significa que al hacer doble clic en un encabezado o en el espacio vacío con una fila seleccionada de antemano todavía se provocaría su ejecución.
Podría intentar con el controlador de evento actual cambiado de celda que funciona solo con un clic y no hacer doble clic si eso es lo que busca, ya que puede usar doble clic para iniciar la celda de edición o toda la fila o para cualquier otro proceso:
private void datagrid_CurrentCellChanged(object sender, EventArgs e)
{
int selected_index = datagrid.SelectedIndex + 1;
// this is used for debugging and testing.
//MessageBox.Show("The index of the row for the clicked cell is " + selected_index);
}
puede agregar el controlador de eventos en ItemContainerStyle
(que es el estilo aplicado a una fila):
<DataGrid ... >
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
</Style>
</DataGrid.ItemContainerStyle>
...
</DataGrid>
Luego, en el controlador, puede verificar si la fila está seleccionada
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
// execute some code
}