2012-08-28 20 views

Respuesta

7

No es tan complicado.

Se necesitan funciones de ayuda;

public static T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
     return child; 
} 

public static DataGridRow GetSelectedRow(this DataGrid grid) 
{ 
    return (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem); 
} 
public static DataGridRow GetRow(this DataGrid grid, int index) 
{ 
    DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    if (row == null) 
    { 
     // May be virtualized, bring into view and try again. 
     grid.UpdateLayout(); 
     grid.ScrollIntoView(grid.Items[index]); 
     row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    } 
    return row; 
} 

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column) 
{ 
    if (row != null) 
    { 
     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); 

     if (presenter == null) 
     { 
      grid.ScrollIntoView(row, grid.Columns[column]); 
      presenter = GetVisualChild<DataGridCellsPresenter>(row); 
     } 

     DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
     return cell; 
    } 
    return null; 
} 

public static DataGridCell GetCell(this DataGrid grid, int row, int column) 
{ 
    DataGridRow rowContainer = grid.GetRow(row); 
    return grid.GetCell(rowContainer, column); 
} 

Usa yourDataGrid.GetCell (5, 3) .Content = "lo que quieras";

+0

Muchas gracias a mi amigo – KF2

+5

Se trata de una broma, ¿verdad? ¡Uno solía necesitar solo una línea para obtener/establecer el valor de una vista de gráfico de datos en Winforms! –

+2

@bodycountPP; Lamentablemente no. Aunque, la verdad es que nunca se debe cambiar valor de la celda mediante programación - esto no es lo WPF es para, WPF no es el reemplazo o actualización de Windows Forms, es una nueva innovación. Mire en DataGridView y MVVM para ver cómo se deben hacer las cosas en las aplicaciones comerciales. –

2

Por ejemplo, si usted tiene cuadro de texto en su grid

<TextBox Grid.Row="2" Grid.Column="3" Text="{Binding ...}"/> 

muestra completa

<Grid x:Name="RootElement"> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
     <RowDefinition/> 
     </Grid.RowDefinitions> 

     ... 
     <TextBox Grid.Row="2" Grid.Column="3" Text="{Binding ...}"/> 
     ... 
    </Grid> 

Puede utilizar estos ayudantes; tienes este enlace http://techiethings.blogspot.fr/2010/05/get-wpf-datagrid-row-and-cell.html.

Iadded el código con el fin de guardar el código en stackoverflow, en el caso en el sitio convertido cerrado

public static DataGridRow GetRow(this DataGrid grid, int index) 
{ 
    DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    if (row == null) 
    { 
     // May be virtualized, bring into view and try again. 
     grid.UpdateLayout(); 
     grid.ScrollIntoView(grid.Items[index]); 
     row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    } 
    return row; 
} 

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column) 
{ 
    if (row != null) 
    { 
     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); 

     if (presenter == null) 
     { 
      grid.ScrollIntoView(row, grid.Columns[column]); 
      presenter = GetVisualChild<DataGridCellsPresenter>(row); 
     } 

     DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
     return cell; 
    } 
    return null; 
} 

public static DataGridCell GetCell(this DataGrid grid, int row, int column) 
{ 
    DataGridRow rowContainer = grid.GetRow(row); 
    return grid.GetCell(rowContainer, column); 
} 
+0

quiero hacerlo programática, mi selección no es estático cada vez que seleccione la celda diferente, ¿cómo puedo hacerlo? – KF2

+0

he añadido el código –

+0

todas las cosas está bien, pero cuando me muevo gw desplazarse hacia arriba o hacia abajo de datos será un problema de disappear.what? – KF2

Cuestiones relacionadas