【问题标题】:SQLite Datagrid ValidationSQLite 数据网格验证
【发布时间】:2017-04-01 02:33:40
【问题描述】:

我在 WPF 表单上有一个 DataGrid,它的 ItemsSource 属性设置为 DataTable。这个DataTable 是从一个SQLite 表中填充的,我正在使用一个DataGridTemplateColumn 来显示其中一个列,该ComboBox 填充了一个ComboBoxComboBox 正确显示了 DummyClass 类中的 DisplayMember(字符串)和 SelectedValue(整数)。但是,当我从 ComboBox 中选择一个值时,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;

【问题讨论】:

    标签: c# wpf sqlite combobox datagrid


    【解决方案1】:

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

    原来 ValueMember 表的 SQLite 数据类型与分配给 DataGrid 中组合框的字段的数据类型不匹配。查找表中的 ValueMember 字段设置为 SQLite 数据类型“整数”。与DataGrid表绑定的SQLite表的组合框字段中的SQLite数据类型为SQLite类型'int'。

    SQLite 类型“整数”映射到 .Net System.Int64,其代码为 typeof(Long)。

    SQLite 类型 'int' 映射到 .Net System.Int32,在代码中是 typeof(int)。

    所以我修改了 SQLite 表以确保所有整数类型字段都是 SQLite 类型“int”。

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

    现在 DataGridViewComboBoxColumn 的行为符合预期。

    【讨论】:

    • 这是对您如何解决我遇到的基本相同问题的更详细描述,因此我将其标记为解决方案。希望你没有像我一样把头撞到墙上,最终发现这个看似微不足道的解决方案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2013-04-04
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多