Мне нужно прочитать все значения столбца в сетке данных в приложении 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);
}
Это XMAL-декларация datagrid
<DataGrid x:Name ="dgridList" Margin="0,0,0,0" Grid.Row="1" IsReadOnly="True" AutoGenerateColumns="False">
Эта итерация работает правильно, если сетка данных содержит только 3,4 объекта (если мы добавим больше элементов в сетку, то итерация сетки не работает.). Если мы увеличим количество элементов, также будет виден коляска. (поскольку размер сетки данных задан как маленький)
An unhandled exception of type 'System.ArgumentNullException' occurred in PresentationFramework.dll
Additional information: Value cannot be null.
Если я попытаюсь прочитать значения в сетке данных (более 4 элементов), я получаю эту ошибку.
Как я могу это решить.
Если вы установили свойство ItemsSource
DataGrid
в IEnumerable<YourClass>
, вы можете просто 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>
ViewModel (сначала потребовалась реализация 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() )
}
}