Считать значения Data Grid в WPF

2

Мне нужно прочитать все значения столбца в сетке данных в приложении 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 элементов), я получаю эту ошибку.

Как я могу это решить.

  • 0
    Сделайте себе одолжение и выучите MVVM. Эта и другие «проблемы» больше не являются проблемами.
Теги:
wpf
datagrid

2 ответа

2
Лучший ответ

Если вы установили свойство 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);
}
1

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() )
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню