Winform 中 GrideView 中下拉列的绑定问题,其实之前做过的,好久没再用过,今天突然用到竟然又费了九牛二虎之力,好纠结地说。。虽然最后问题出在一个数据类型的细节的,所以还是 Mark 一下,加强记忆 . 代码部分很少,我把使用设计视图中产生的EF 代码和常用的 DataTable 和 IList 三种数据源绑定放在一起,比较一下其实跟普通的绑定一样 :
// TODO: 这行代码将数据加载到表“dS_Student.SEXENUM”中。您可以根据需要移动或删除它。
this.sEXENUMTableAdapter.Fill(this.dS_Student.SEXENUM);
// TODO: 这行代码将数据加载到表“dS_Student.STUDENTINFO”中。您可以根据需要移动或删除它。
this.sTUDENTINFOTableAdapter.Fill(this.dS_Student.STUDENTINFO);
// 使用数据源工具时产生的自动代码
this.sEXDataGridViewTextBoxColumn.DataSource = this.sEXENUMBindingSource;
this.sEXDataGridViewTextBoxColumn.DisplayMember = "LABELTEXT";
this.sEXDataGridViewTextBoxColumn.ValueMember = "VALUE";
this.sEXDataGridViewTextBoxColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.sEXDataGridViewTextBoxColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
// 记得设置这个哟
dataGridView1.AutoGenerateColumns = false;
// List 数据源
List<ComboItem> list = new List<ComboItem>();
list.Add(new ComboItem("女", 0));
list.Add(new ComboItem("男", 1));
// DataTable 数据源
DataTable dtSex = new DataTable();
DataColumn columnLABELTEXT = new global::System.Data.DataColumn("LABELTEXT", typeof(string), null, global::System.Data.MappingType.Element);
dtSex.Columns.Add(columnLABELTEXT);
DataColumn columnVALUE = new global::System.Data.DataColumn("VALUE", typeof(int), null, global::System.Data.MappingType.Element);
dtSex.Columns.Add(columnVALUE);
columnLABELTEXT.MaxLength = 20;
dtSex.Rows.Add(new object[] { "女", 0 });
dtSex.Rows.Add(new object[] { "男", 1 });
// 绑定到 List
sEXDataGridViewTextBoxColumn.DataSource = list;
// 绑定到 DataTable
sEXDataGridViewTextBoxColumn.DataSource = dtSex;
1,使用可视化指定列的显示类型后,即 DataGridViewComboBoxColumn
2. 创建该下拉列所依赖的数据源,可以是.Net通用的数据源绑定方式,包括 DataTable , IList 等
3. 确认 DisplayMember 、ValueMember 和 关联列有没有写对,数据类型是不是一致的。
今天的问题就是跪在第三步了,Oracle中没有bool类型所以就使用 Number(1,0) 结果产生的表的字段类型为 Decimal ,然后数据类型就不一致了,然后就挂了
4.一个修改自动生成EF实体数据类型的小捷径。
可以从下拉列表里面选择自己需要的数据类型,对于Oracle 中的 Number 在.Net 平台中识别为 Decimal ,即便我的定义是 number(1,0) 这样的逻辑上的整数值。.Net 平台会负责正常的数据类型强制转换,当然你需要决定是不是必须考虑精度和溢出这样特定的情景。
-- 对于 定义为 Number (1,0) 的 性别 这个属性来说,自然不存在这个问题。