我在wpf中有一个名为datagrid1
的datagridview。我需要读取datagrid中每个单元格的值。我知道如何在Windows窗体中执行此操作
string result = datagrid1.Rows[0].Cells[1].Value.ToString();
WPF中的这个怎么做?
答案 0 :(得分:1)
在WPF中没有简单的方法可以做到这一点,但是这个tutorial对您有用。
编辑:
首先,我完全赞同上面提到的Nitin Joshi的评论。
第二,根据这个answer WPF数据网格被构建为绑定到像DataTable这样的东西。大多数情况下,您会修改DataTable
以及DataTable
中绑定到DataGrid
的行/列,而不是DataGrid
自己,所以你不需要使用像datagrid1.Rows[0].Cells[1].Value
这样的东西。但如果你仍然坚持以这种方式获得价值,那么这是一个解决方案:
第二次编辑:
由于您只询问了一种读取呼叫值的方法,因此我的答案会更短,但也会更具体:
GetCellValue方法返回一个字符串值,表示列/行索引的给定DataGrid
的单元格内容:
我写了这个方法,假设列类型是TextBox
,TextBlock
或ComboBox
。其他类型可以采用相同的方式处理。
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]的值。
*注意:
SelectionUnit
的{{1}}必须设为DataGrid
。Cell
必须完全生成,否则DataGrid
将返回null。 ItemContainerGenerator
类型更常见的少数UIElements
。