2017-04-05 63 views
1

我需要读取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. 

我该如何解决这个问题。

+0

帮自己一个忙,学习MVVM。这个和其他“问题”不再是问题。 –

回答

1

如果您在DataGridItemsSource属性设置为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); 
} 
0

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