读取WPF gridview中的每个单元格值

时间:2015-05-19 08:22:38

标签: c# wpf datagridview

我在wpf中有一个名为datagrid1的datagridview。我需要读取datagrid中每个单元格的值。我知道如何在Windows窗体中执行此操作

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

WPF中的这个怎么做?

1 个答案:

答案 0 :(得分:1)

在WPF中没有简单的方法可以做到这一点,但是这个tutorial对您有用。

编辑:

首先,我完全赞同上面提到的Nitin Joshi的评论。 第二,根据这个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);(例如来自Button click事件)将返回dataGrid [2,1]的值。

*注意:

  1. SelectionUnit的{​​{1}}必须设为DataGrid
  2. Cell必须完全生成,否则DataGrid将返回null。
  3. GetCellValue方法适用于被视为ItemContainerGenerator类型更常见的少数UIElements