2011-06-15 29 views
8

Tengo una cuadrícula WPF que está dividida en 3 filas y 3 columnas, No he podido encontrar la forma de obtener el número de fila y columna de clic del mouse en la red, ohh y si es posible, será mejor para mi programa que esta parte será en el código y no XAML, esta es mi simple rejilla:Obtener celda de cuadrícula con el mouse clic

<Grid Name="GridCtrl" ShowGridLines="True"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="3*" /> 
     <RowDefinition Height="3*" /> 
     <RowDefinition Height="3*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*" /> 
     <ColumnDefinition Width="3*" /> 
     <ColumnDefinition Width="3*" /> 
    </Grid.ColumnDefinitions> 
    </Grid> 
+0

Por favor, elabore su pregunta un poco más ... – Syeda

Respuesta

1

está aquí la respuesta: Ways to identify which cell was clicked on WPF Grid?

nunca he utilizado WPF Grid before, aunque usando ese enlace de arriba como ejemplo, creo que algo como esto debería hacerlo:

Agregue esto a su método de inicialización:

this.GridCtrl.MouseDown += new MouseButtonEventHandler(GridCtrl_MouseDown); 

Y añadir nuevo método para controlar el evento:

private void GridCtrl_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (sender != null) 
    { 
     Grid _grid = sender as Grid; 
     int _row = (int)_grid.GetValue(Grid.RowProperty); 
     int _column = (int)_grid.GetValue(Grid.ColumnProperty); 
     MessageBox.Show(string.Format("Grid clicked at column {0}, row {1}", _column, _row)); 
    } 
} 
+0

_grid.GetValue (Grid.RowProperty); obtendrá la fila _grid está en una cuadrícula principal, que no es ninguna pregunta – markmnl

1

que usar algo como esto:

private void DataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     // Check if the user double-clicked a grid row and not something else 
     if (e.OriginalSource == null) return; 
     var row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow; 

     // If so, go ahead and do my thing 
     if (row != null) 
     { 
      var Item = (CLASS_YOU_USE_TO_BIND)DataGrid1.Items[row.GetIndex()]; 
//Here you can work with Item, it is now the object of class you used in 
//DataGrid.DataSource 
     } 
} 
+1

fue sobre un 'Grid' no' DataGrid' – markmnl

7

enfrentan a los mismos problema que surgió con esta solución:

XAML:

<Grid Name="myGrid" Background="Transparent" PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"> 

NOTA: El Grid tiene que ser dado un fondo para elevar el caso del ratón, consulte: How to get a Grid to raise MouseDown events when no UIElemets in cells clicked?

de código subyacente:

private void OnPreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    if(e.ClickCount == 2) // for double-click, remove this condition if only want single click 
    { 
     var point = Mouse.GetPosition(myGrid); 

     int row = 0; 
     int col = 0; 
     double accumulatedHeight = 0.0; 
     double accumulatedWidth = 0.0; 

     // calc row mouse was over 
     foreach (var rowDefinition in myGrid.RowDefinitions) 
     { 
      accumulatedHeight += rowDefinition.ActualHeight; 
      if (accumulatedHeight >= point.Y) 
       break; 
      row++; 
     } 

     // calc col mouse was over 
     foreach (var columnDefinition in myGrid.ColumnDefinitions) 
     { 
      accumulatedWidth += columnDefinition.ActualWidth; 
      if (accumulatedWidth >= point.X) 
       break; 
      col++; 
     } 

     // row and col now correspond Grid's RowDefinition and ColumnDefinition mouse was 
     // over when double clicked! 
    } 
} 
-1

Intenta esto

Grid.GetRow(NAME OF GRID) 
Grid.GetColumn(NAME OF GRID) 
Cuestiones relacionadas