2015-05-19 222 views
2

我在wpf中有一個名爲datagrid1的datagridview。我需要讀取datagrid中每個單元格的值。我知道如何做到這一點在Windows窗體讀取WPF gridview中的每個單元格值

string result = datagrid1.Rows[0].Cells[1].Value.ToString(); 

這是如何在WPF中?

+0

你在開發中使用'MVVM'模式嗎?如果沒有,你仍然可以在你的cs文件中訪問'datagrid1'。 –

+1

請指定爲什麼要讀取單元格值?最佳做法是使用MVVM,而且不會遇到這種情況。 –

回答

1

有沒有簡單的方法來做到這一點在WPF中,但這tutorial可以用於你。

編輯:

所有我完全尼廷·喬希上述評論表示贊同的第一位。 二,根據這個answer WPF數據網格的建立是爲了綁定到類似於DataTable的東西。大多數情況下,您將修改DataTable以及DataTable內與DataGrid綁定的行/列,而不是DataGrid它自己,因此您不需要使用類似datagrid1.Rows[0].Cells[1].Value的東西。但是,如果你仍然堅持得到值的方式,這裏是一個解決方案:

第二個編輯: 既然你只要求一個方法來讀取調用價值,我會讓我的答案短,但也有點更具體的: GetCellValue方法返回表示通過列/行索引給定DataGrid的細胞內容的字符串值:

我寫這個方法假定列類型要麼TextBoxTextBlockComboBox。其他類型可以用相同的方式處理。

public string GetCellValue(DataGrid datagrid, int row, int column) 
    { 
     var cellInfo = new DataGridCellInfo(
      datagrid.Items[row], dataGrid.Columns[column]); 

     DataGridCell cell = null; 
     var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item); 
     if (cellContent != null) 
      cell = (DataGridCell)cellContent.Parent; 

     if (cell == null) return string.Empty; 

     // if DataGridTextColumn/DataGridComboBoxColumn is used 
     // or AutoGeneratedColumns is True 
     if (cell.Content is TextBlock) 
      return ((TextBlock)cell.Content).Text; 
     else if (cell.Content is ComboBox) 
      return ((ComboBox)cell.Content).Text; 

     // if DataGridTemplateColumn is used 
     // assuming cells are either TextBox, TextBlock or ComboBox. Other Types could be handled the same way. 
     else 
     { 
      var txtPresenter = FindVisualChild<TextBox>((ContentPresenter)cell.Content); 
      if (txtPresenter != null) return txtPresenter.Text; 
      var txbPresenter = FindVisualChild<TextBlock>((ContentPresenter)cell.Content); 
      if (txbPresenter != null) return txbPresenter.Text; 
      var cmbPresenter = FindVisualChild<ComboBox>((ContentPresenter)cell.Content); 
      if (cmbPresenter != null) return cmbPresenter.Text; 
     } 
     return string.Empty; 
    } 

    public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is T) 
       return (T)child; 
      else 
      { 
       T childOfChild = FindVisualChild<T>(child); 
       if (childOfChild != null) 
        return childOfChild; 
      } 
     } 
     return null; 
    } 

然後調用string result = GetCellValue(dataGrid, 2, 1);(例如,從一個按鈕點擊事件),將返回的數據網格[2,1]的值。

*注:

  1. DataGridSelectionUnit必須設置爲Cell
  2. DataGrid必須完全產生,否則ItemContainerGenerator返回null。
  3. GetCellValue方法適用於幾個UIElements認爲更常見,可用作DataGridColumn類型。
+0

感謝您的解決方案。但我有上面的代碼的另一個問題。即在方法「SelectCellByIndex」條件「if(cell.Content是TextBlock)」中返回false,則返回結果爲null(空)。 datagrid已完全生成,但爲什麼將空值作爲單元格值返回。 – Tharindu

+0

我寫了一段代碼,假設你的datagrid中的每個單元都是一個TextBlock。什麼是cell.content類型?如果它不是TextBlock,則嘗試找出該類型,然後更改該部分代碼以返回表示單元格值的字符串值。 –