2012-11-02 13 views
6

Dla WinForms to:Uzyskiwanie wartość komórki w DataGrid w WPF

var value = DataGridView.Rows[0].Cells[0].Value 

Czy istnieje jakiś sposób, aby dostać go w WPF?

+1

Jak mówię każdemu deweloperowi WinForma, że ​​znajduję jego głowę przeciwko WPF ... zapomnij wszystkiego, czego nauczyłeś się od WinForm, to jest inna (czasy lepsze IMO) i wymaga zupełnie innego sposobu myślenia. Spójrz na MVVM i poznaj możliwości wiązania WPF –

Odpowiedz

5

Myślę, że najlepszym sposobem byłoby użyć właściwości przedmioty i bezpośrednio uzyskać dostęp do elementu danych:

var dataItem = dataGrid.Items[0] as ...; 

ale można użyć tej klasy, aby uzyskać komórkę i dostęp do wartości z getValue() metoda (byłoby bardziej jak twój przykład).

Kod wzięty stąd: datagrid get cell index

static class DataGridHelper { 
    static public DataGridCell GetCell(DataGrid dg, int row, int column) { 
     DataGridRow rowContainer = GetRow(dg, 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 
       dg.ScrollIntoView(rowContainer, dg.Columns[column]); 
       cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      } 
      return cell; 
     } 
     return null; 
    } 

    static public DataGridRow GetRow(DataGrid dg, int index) { 
     DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index); 
     if (row == null) { 
      // may be virtualized, bring into view and try again 
      dg.ScrollIntoView(dg.Items[index]); 
      row = (DataGridRow)dg.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; 
    } 
} 
3

Generalnie, nie ma potrzeby, aby to zrobić. W WPF, datagrid ma być używany z powiązaniem danych, co oznacza, że ​​istnieje bazowa kolekcja lub obiekt, który ma taką samą wartość jak komórka, więc musisz uzyskać bezpośredni dostęp do tego zbioru/obiektu. Jeśli chcesz uzyskać dostęp do wartości komórki, może być konieczne ponowne rozpatrzenie projektu.

Powiązane problemy