Note: InvalidCastException in case of converting Char to Boolean.
To reproduce: use the following code snippet:
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Active", typeof(string));
dt.Rows.Add("1", "Item1", "Y");
dt.Rows.Add("2", "Item2", "N");
this.radGridView1.DataSource = dt;
this.radGridView1.Columns.RemoveAt(2);
GridViewCheckBoxColumn checkBoxColumn = new GridViewCheckBoxColumn();
checkBoxColumn.FieldName = "Active";
checkBoxColumn.DataTypeConverter = new ToggleStateConverter();
radGridView1.MasterTemplate.Columns.Add(checkBoxColumn);
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
radGridView1.EnableFiltering = true;
}
public class ToggleStateConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(ToggleState);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
string charValue = value + "";
switch (charValue)
{
case "Y":
return ToggleState.On;
case "N":
return ToggleState.Off;
case "M":
return ToggleState.Indeterminate;
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(ToggleState);
}
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value)
{
ToggleState state = (ToggleState)value;
switch (state)
{
case ToggleState.On:
return "Y";
case ToggleState.Off:
return "N";
case ToggleState.Indeterminate:
return "M";
}
return base.ConvertFrom(context, culture, value);
}
}
Try to filter by "Name" column. As a result FormatException occurs because of inability to convert "Y"/"N" to Boolean although a custom TypeConverter is implemented to handle it.