2012-08-28 15 views

risposta

7

Non è così complicato.

Sono necessarie le funzioni di supporto;

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); 
} 

Utilizzare yourDataGrid.GetCell (5, 3) .Content = "tutto ciò che si desidera";

+0

Grazie mille amico mio – KF2

+5

Questo è uno scherzo, vero? Uno aveva bisogno solo di una linea per ottenere/impostare il valore di un Datagridview in Winforms! –

+2

@bodycountPP; Sfortunatamente no. Anche se, la verità è che non dovresti mai cambiare il valore della cella a livello di codice - non è quello che serve per WPF, WPF non è la sostituzione o l'aggiornamento delle winform, è una novità. Guarda in DataGridView e MVVM per vedere come vanno fatte le cose nelle applicazioni commerciali. –

2

Per esempio, se si dispone di TextBox sulla griglia

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

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

È possibile utilizzare questi aiutanti; hai questo link http://techiethings.blogspot.fr/2010/05/get-wpf-datagrid-row-and-cell.html.

Iadded il codice al fine di salvare il codice su StackOverflow, nel caso in cui il sito diventerà chiuso

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

voglio programmatico, la mia selezione non è statica ogni volta che seleziono una cella diversa, come posso farlo? – KF2

+0

Ho aggiunto il codice –

+0

ogni cosa è OK ma quando mi muovo gw scorri verso l'alto o verso il basso i dati spariranno.che problema? – KF2

Problemi correlati