Как упомянуто выше, кажется невозможным изменить внешний вид логических значений в сценарии с привязкой к данным.
Даже 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";
}
}