2009-11-18 7 views

Répondre

8

pls, essayez de mettre le code ci-dessous dans votre de bouton sur gestionnaire d'événements, cliquez sur:

DataGridCell cell = GetCell(1, 0); 
    if (cell != null) 
    { 
     cell.Focus(); 
     yourDataGrid.BeginEdit(); 
    } 

ci-dessous est la mise en œuvre de la méthode GetCell prise d'ici Grabing controls from a DataGrid

public DataGridCell GetCell(int row, int column) 
{ 
    DataGridRow rowContainer = GetRow(row); 

    if (rowContainer != null) 
    { 
     DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 

     // try to get the cell but it may possibly be virtualized 
     DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
     if (cell == null) 
     { 
      // now try to bring into view and retreive the cell 
      gridPersons.ScrollIntoView(rowContainer, gridPersons.Columns[column]); 
      cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
     } 
     return cell; 
    } 
    return null; 
} 

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

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

espérons que cette aide, ce qui

+0

J'essaie et ça marche! Merci beaucoup! Fonction très utile. –

+0

J'ai rencontré le même problème. Ce code ne fonctionne pas pour moi directement. Cependant, cela ne fonctionne que si j'appelle les premières lignes de Dispatcher.BeginInvoke, comme ceci: Dispatcher.BeginInvoke (DispatcherPriority.Render, new Action (() => StartEditCurrentCell())); – newman

Questions connexes