读取WPF中数据网格的值
问题描述:
我需要读取WPF应用程序中数据网格中列的所有值。读取WPF中数据网格的值
for (int i = 0; i < dgridList.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dgridList.ItemContainerGenerator.ContainerFromIndex(i);
TextBlock t_name = dgridList.Columns[0].GetCellContent(row) as TextBlock;
TextBlock t_type = dgridList.Columns[1].GetCellContent(row) as TextBlock;
Tuple<string, string> mod = new Tuple<string, string>(t_name.Text, t_type.Text);
Alist.Add(mod);
}
这是DataGrid的XMAL声明
<DataGrid x:Name ="dgridList" Margin="0,0,0,0" Grid.Row="1" IsReadOnly="True" AutoGenerateColumns="False">
这种迭代工作正常,如果数据网格中只包含3,4项(如果我们增加在数据网格迭代更多的项目不起作用。) 。如果我们增加物品,婴儿车栏也可见。如果我尝试读取数据网格(超过4项),我得到这个误差值(因为数据网格大小设置为小)
An unhandled exception of type 'System.ArgumentNullException' occurred in PresentationFramework.dll
Additional information: Value cannot be null.
。
我该如何解决这个问题。
答
如果您在DataGrid
的ItemsSource
属性设置为IEnumerable<YourClass>
,你可以只遍历所有YourClass
对象,并得到他们的属性值:
foreach (var item in dgridList.Items.OfType<YourClass>())
{
var name = item.t_name;
var type = item.t_type;
Tuple<string, string> mod = new Tuple<string, string>(name, type);
Alist.Add(mod);
}
答
XAML
<DataGrid ColumnWidth="*"
IsReadOnly="True"
AutoGenerateColumns="False"
SelectionMode="Single"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
ItemsSource="{Binding MyData}"
SelectedItem="{Binding Item}"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Nº." Binding="{Binding NumberProperty}" MinWidth="100" With="Auto"/>
<DataGridTextColumn Header="Name" Binding="{Binding NameProperty}" Width="*"/>
</DataGrid.Columns>
视图模型(第一它需要执行的INotifyPropertyChanged
)
private ObservableCollection<MyData> _myData;
private MyData _selectdItem;
public ObservableCollection<MyData> DataCollection
{
get { return _myData; }
set { _myData = value; OnPropertyChanged("DataCollection"); }
}
//Your current selected item in the datagrid
public MyData Item
{
get { return _selectdItem; }
set
{
_selectdItem = value;
OnPropertyChanged("Item");
}
}
private void ReadAllItems()
{
foreach (var item in DataCollection)
{
var mod = new Tuple<string, string>(item.Number, item.Name);
Alist.Add(mod);
}
}
private void LoadDataCollection()
{
using (var db = new YourContext())
{
//Your DataGrid will fill here
DataCollection = new ObservableCollection<MyData> (db.YourEntity.List())
}
}
帮自己一个忙,学习MVVM。这个和其他“问题”不再是问题。 –