基于Linq to Entities的DataGridView布尔列转CheckBox列问题
解决DataGridView中bool字段显示为文本而非CheckBox的问题
我懂你现在碰到的情况——用EF从数据库视图生成的Model里,ACCEPT明明是bool类型,但绑定到DataGridView后却显示成了"true"/"false"文本,没法自动变成CheckBox列。其实这是因为DataGridView自动生成列时,偶尔会对EF视图生成的实体属性识别不到位,咱们用两种方法就能解决:
方法一:手动创建列(更直接可控)
这种方式需要咱们自己定义每一列,关闭自动生成列的功能,步骤如下:
- 先关闭DataGridView的自动生成列功能:
DataGridView1.AutoGenerateColumns = false;
- 手动添加需要的列,重点处理ACCEPT的CheckBox列:
// 添加ID列 DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn(); idColumn.DataPropertyName = "ID"; idColumn.HeaderText = "ID"; DataGridView1.Columns.Add(idColumn); // 添加PERSON列 DataGridViewTextBoxColumn personColumn = new DataGridViewTextBoxColumn(); personColumn.DataPropertyName = "PERSON"; personColumn.HeaderText = "人员"; DataGridView1.Columns.Add(personColumn); // 添加ACCEPT的CheckBox列 DataGridViewCheckBoxColumn acceptColumn = new DataGridViewCheckBoxColumn(); acceptColumn.DataPropertyName = "ACCEPT"; // 绑定到实体的ACCEPT属性 acceptColumn.HeaderText = "是否接受"; acceptColumn.TrueValue = true; acceptColumn.FalseValue = false; DataGridView1.Columns.Add(acceptColumn);
- 最后再绑定数据源:
sEntities context = new sEntities(); var lQuery = from p in context.view_1 select p; DataGridView1.DataSource = lQuery.ToList();
方法二:利用自动生成列事件修改列类型(保留自动生成其他列)
如果不想手动定义所有列,只想修改ACCEPT这一列的显示,可以通过监听DataGridView的AutoGeneratingColumn事件来处理:
- 先在窗体的构造函数或者初始化方法里订阅事件:
DataGridView1.AutoGeneratingColumn += DataGridView1_AutoGeneratingColumn;
- 实现事件处理方法,把ACCEPT列替换成CheckBox列:
private void DataGridView1_AutoGeneratingColumn(object sender, DataGridViewAutoGeneratingColumnEventArgs e) { // 判断当前生成的列是否是ACCEPT字段 if (e.Column.DataPropertyName.Equals("ACCEPT", StringComparison.OrdinalIgnoreCase)) { // 取消原来自动生成的文本列 e.Cancel = true; // 创建新的CheckBox列 DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn(); checkColumn.DataPropertyName = "ACCEPT"; checkColumn.HeaderText = e.Column.HeaderText; // 保留原来的表头文本 checkColumn.Name = e.Column.Name; // 添加到DataGridView中 ((DataGridView)sender).Columns.Add(checkColumn); } }
- 正常绑定数据源即可,其他列会自动生成,只有ACCEPT列会变成CheckBox。
另外提一句,你的PERSON属性用了internal set,如果后续发现PERSON列没法编辑或者数据显示有问题,可以把set改成public,不过当前你的问题是ACCEPT的显示,这个应该不影响。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

