我有一个DGV绑定到一个对象列表。这工作正常,除了其中一个对象属性是布尔值,因此显示为一个复选框,但我更喜欢一个简单的是/否文本字段。我已经考虑添加一个额外的列,并根据布尔值填充适当的字符串,但这似乎有点超过顶部。有更简单的方法吗?
DGV是只读的。
答案 0 :(得分:5)
如上所述,似乎无法在数据绑定方案中更改布尔值的视觉外观。 即使 DataGridViewCellStyle.FormatProvider 也无法正常使用System.Int32,System.Int64,System.Decima等类型。
因此我找到了一个对我有用的解决方法。可能它不是最好的解决方案,但目前它符合我的需求。 我处理 DataGridView.ColumnAdded 事件并将 DataGridViewCheckBoxColumn 替换为 DataGridViewTextBoxColumn 。之后我使用 CellFormating 事件(由Microsoft推荐,请参阅上面的链接)来格式化源数据。
private DataGridViewTextBoxColumn textBoxColumn = null;
void _dataGrid_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
// Avoid recursion
if (e.Column == textBoxColumn) return;
DataGridView gridView = sender as DataGridView;
if (gridView == null) return;
if( e.Column is DataGridViewCheckBoxColumn)
{
textBoxColumn = new DataGridViewTextBoxColumn();
textBoxColumn.Name = e.Column.Name;
textBoxColumn.HeaderText = e.Column.HeaderText;
textBoxColumn.DataPropertyName = e.Column.DataPropertyName;
gridView.Columns.Insert(e.Column.Index, textBoxColumn);
gridView.Columns.Remove(e.Column);
}
}
void _dataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
DataGridViewColumn col = _dataGrid.Columns[e.ColumnIndex];
try
{
if ( col.Name == "IsMale")
{
bool isMale = Convert.ToBoolean(e.Value);
e.Value = isMale ? "male" : "female";
}
}
catch (Exception ex)
{
e.Value = "Unknown";
}
}
答案 1 :(得分:3)
看起来这是不可能的,所以我作弊。我向业务对象添加了一个只读属性,该属性返回一个基于boolean属性的字符串。我只是隐藏了DGV中的布尔列并显示了字符串属性。
答案 2 :(得分:0)
编辑显示布尔值的列,以便ColumnType属性= DataGridViewTextBoxColumn。
该列现在将显示字符串True / False。
在设计师中进行此更改:
在设计器中,右键单击DGV。
在弹出菜单上,选择“编辑列...”将出现“编辑列”对话框。
在“编辑列”对话框中,选择左侧的列,然后在右侧找到属性(包括ColumnType)。
您可以在将列添加到DGV时以编程方式设置ColumnType:
DataGridViewColumn column = new DataGridViewColumn();
DataGridViewCell cell = new DataGridViewTextBoxCell();
column.CellTemplate = cell;
dgv.Columns.Add(column);
来自MSDN的代码。
答案 3 :(得分:0)
一种有用的方法是使用DataGridViewComboBoxColumn将布尔值解码为所需的任何字符串。如果您确保显示值列表的首字母不同(用户可以将单元格聚焦并按键盘上的单个键来更改组合),它还保留了编辑值的功能,甚至可以为用户提供快捷方式。选择)。
组合列不仅限于布尔值-任何固定的值列表,查找,枚举等都是不错的选择。这就是连接布尔值的方式。它使用字符串/布尔元组作为后备存储,供组合从以下位置查找/查找:
dataGridView1.Columns.Add(new DataGridViewComboBoxColumn() {
DataPropertyName = "NameOfYourBoolColumnInYourDataTableThatTheGridIsBoundTo";
DisplayMember = "Item1", //the string in the Tuple
ValueMember = "Item2", //the bool in the Tuple
DataSource = new List<Tuple<string, bool>>() { //the list of Tuples
new Tuple<string, bool>("Yeah baby", true),
new Tuple<string, bool>("Noooo way", false)
}
});
此网格现在将显示一个组合,它曾经显示一个复选框,并且编辑该组合将更改主数据表中的布尔值
如果您的datagridview是在表单设计器中设计的,那么最简单的方法可能是将DispVal表添加到强类型的数据集,然后在选择器中将其作为“项目列表实例”提供,使您可以选择数据源用于组合列