Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取WPF gridview中的每个单元格值_C#_Wpf_Datagridview - Fatal编程技术网

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

C# 读取WPF gridview中的每个单元格值,c#,wpf,datagridview,C#,Wpf,Datagridview,我在wpf中有一个名为datagrid1的datagridview。我需要读取datagrid中每个单元格中的值。我知道如何在windows窗体中执行此操作 string result = datagrid1.Rows[0].Cells[1].Value.ToString(); 如何在WPF中做到这一点?在WPF中没有简单的方法可以做到这一点,但是这对您很有用 编辑: 首先,我完全同意上面提到的尼廷·乔希的评论。 其次,根据这一点,WPF datagrid被构建为绑定到类似DataTable的

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

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

如何在WPF中做到这一点?

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

编辑:

首先,我完全同意上面提到的尼廷·乔希的评论。 其次,根据这一点,WPF datagrid被构建为绑定到类似DataTable的东西。大多数情况下,您将修改
DataTable
,以及绑定到
DataGrid
DataTable
中的行/列,而不是
DataGrid
本身,因此无需使用类似的
datagrid1.Rows[0].Cells[1].Value
。但如果您仍然坚持以这种方式获取价值,那么以下是一个解决方案:

第二次编辑: 由于您只要求提供一种读取调用值的方法,因此我将使我的答案更短,但也更具体一点: GetCellValue方法返回一个字符串值,该字符串值通过列/行索引表示给定
DataGrid
的单元格内容:

我编写此方法时假设列类型为
TextBox
TextBlock
ComboBox
。其他类型也可以用同样的方法处理

公共字符串GetCellValue(DataGrid DataGrid,int行,int列)
{
var cellInfo=新数据网格cellInfo(
datagrid.Items[row],datagrid.Columns[column]);
DataGridCell=null;
var cellContent=cellInfo.Column.GetCellContent(cellInfo.Item);
if(cellContent!=null)
cell=(DataGridCell)cellContent.Parent;
if(cell==null)返回字符串.Empty;
//如果使用DataGridTextColumn/DataGridComboxColumn
//或自动生成的列为True
if(cell.Content为TextBlock)
返回((TextBlock)cell.Content).Text;
else if(cell.Content为组合框)
返回((组合框)cell.Content).Text;
//如果使用DataGridTemplateColumn
//假设单元格为TextBox、TextBlock或ComboBox。其他类型的单元格也可以采用相同的方式处理。
其他的
{
var txtPresenter=FindVisualChild((ContentPresenter)cell.Content);
如果(txtPresenter!=null),则返回txtPresenter.Text;
var txbPresenter=FindVisualChild((ContentPresenter)cell.Content);
如果(txbPresenter!=null),则返回txbPresenter.Text;
var cmbPresenter=FindVisualChild((ContentPresenter)cell.Content);
如果(cmbPresenter!=null)返回cmbPresenter.Text;
}
返回字符串。空;
}
公共静态T FindVisualChild(DependencyObject对象),其中T:DependencyObject
{
for(int i=0;i
然后调用
stringresult=GetCellValue(dataGrid,2,1)(例如,从按钮点击事件)将返回dataGrid[2,1]的值

*注:

  • 数据网格的
    选择单元
    必须设置为
    单元格
  • DataGrid
    必须完全生成,否则
    ItemContainerGenerator
    返回null
  • GetCellValue方法适用于少数
    UIElements
    ,这些元素被认为更常用于
    DataGridColumn
    类型
    您在开发中是否使用了
    MVVM
    模式?如果没有,您仍然可以访问cs文件中的
    datagrid1
    。请指定您要读取单元格值的原因?最佳实践是使用MVVM,您不会遇到这种情况。感谢您的解决方案。但是我对上面的代码还有一个问题。这在方法“SelectCellByIndex”条件“如果(cell.Content是TextBlock)”返回false,则返回结果为null(空)。datagrid已完全生成,但为什么要将空值作为单元格值返回呢?我编写了这段代码,假设datagrid中的每个单元格都是TextBlock。cell.content的类型是什么?如果不是TextBlock,则尝试找出类型,并更改代码的该部分以返回表示单元格值的字符串值。
        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;
        }