2017-04-01 60 views
0

我有一个DataGrid WPF窗体上ItemsSource属性设置为DataTable。这个DataTable是从SQLite表填充的,我使用填充ComboBoxDataGridTemplateColumn来显示其中一列。 ComboBox正确显示 DummyClassDisplayMember(字符串)和SelectedValue(int)。但是,当我从ComboBox中选择一个值时,DataGrid在该行旁边显示验证错误(红色感叹号)。SQLite Datagrid验证

我为ComboBox更改了选择时添加了一个事件处理程序,以便我可以查看验证错误。验证错误如下:

无法转换值'1'。

其中'1'是ComboBox中刚刚选择的任何索引。

什么导致此验证错误?

 InitializeComponent(); 

     DummyClassCollection = new ObservableCollection<DummyClass>(); 
     DummyClassCollection.Add(new DummyClass() { DisplayValue = "Item1", SelectedValue = 0 }); 
     DummyClassCollection.Add(new DummyClass() { DisplayValue = "Item2", SelectedValue = 1 }); 

     table = new DataTable(); 
     dgData.ItemsSource = table.DefaultView; 

     DataGridTemplateColumn templateColumn = new DataGridTemplateColumn(); 
     DataTemplate dataTemplate = new DataTemplate(); 
     FrameworkElementFactory control = new FrameworkElementFactory(typeof(ComboBox)); 

     control.SetValue(ComboBox.ItemsSourceProperty, DummyClassCollection); 
     control.SetValue(ComboBox.DisplayMemberPathProperty, "DisplayValue"); 
     control.SetValue(ComboBox.SelectedValuePathProperty, "SelectedValue"); 

     control.AddHandler(ComboBox.SelectionChangedEvent, new SelectionChangedEventHandler(ComboBox_SelectionChanged)); 

     Binding b = new Binding(); 
     b.Path = new PropertyPath("tableID"); 
     b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     b.Mode = BindingMode.TwoWay; 

     control.SetBinding(ComboBox.SelectedValueProperty, b); 

     dataTemplate.VisualTree = control; 
     templateColumn.CellTemplate = dataTemplate; 

     //dgData.AutoGenerateColumns = false; 
     dgData.Columns.Add(templateColumn); 

     string connection = @"Data Source = " + database + "; Version=3; foreign keys=true;"; 
     sqlc = new SQLiteConnection(connection); 
     sqlcmd = new SQLiteCommand("SELECT * FROM tblExample", sqlc); 
     adapter = new SQLiteDataAdapter(sqlcmd); 
     sqlcmdb = new SQLiteCommandBuilder(adapter); 

     adapter.InsertCommand = sqlcmdb.GetInsertCommand(); 
     adapter.UpdateCommand = sqlcmdb.GetUpdateCommand(); 
     adapter.DeleteCommand = sqlcmdb.GetDeleteCommand(); 
     adapter.AcceptChangesDuringUpdate = true; 
     adapter.Fill(table); 

     templateColumn.Header = table.Columns[1].ColumnName; 

回答

1

我刚刚制定了一个类似的问题,但在Windows窗体DataGrid对象。我使用SQLite表作为数据源。我已经从特定的SQLite表中分配了具有DisplayMember和ValueMember的DataGridViewComboBoxColumn。但是,当我运行代码时,DataGrid没有显示DisplayMember值,我只能看到绑定到DataGrid的表中存储的整数值。

发现ValueMember表的SQLite数据类型与分配给DataGrid中组合框的字段的数据类型不匹配。查找表中的ValueMember字段被设置为SQLite数据类型'Integer'。绑定到DataGrid表的SQLite表的组合框字段中的SQLite数据类型是SQLite类型“int”。

SQLite类型'Integer'映射到.Net System.Int64,其代码为typeof(Long)。

SQLite类型'int'映射到代码为typeof(int)的.Net System.Int32。

因此,我修改了SQLite表,以确保所有整数类型字段都是SQLite类型'int'。

然后,我修改了我的C#数据集代码,以便所有整数类型字段都设置为typeof(int)。

现在,DataGridViewComboBoxColumn的行为如预期。

+0

这是一个更详细的描述,你如何解决我碰到的基本相同的问题,所以我将其标记为解决方案。希望只要我确实发现了这个看似微不足道的解决方案,你就不会碰壁。 – Doug

0

在SQLite的表中的列是Long类型,其中我观察到的集合属性是int型的。这导致了数据验证错误。