C# 读取WPF gridview中的每个单元格值
我在wpf中有一个名为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的
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;
}