datagridvew绑定数据源的时候,我们经常会利用datagridview的特性,可以自动化的添加不通的列,但是只能支持bool类型和字符串类型。列只有DataGridViewTextBoxColumn和DataGridViewCheckBoxColumn列类型。这里我需要使用DataGridViewComboBoxColumn时无法处理。为解决此问题。详情看代码:
手动添加必须将AutoGenerateColumns设置为false
this.dataGridView2.AutoGenerateColumns = false;
类
public class Test
{
/// <summary>
/// 电压等级
/// </summary>
[DisplayName("电压等级")]
public bool select { get; set; }
/// <summary>
/// 类型
/// </summary>
[DisplayName("类型")]
public EnumTest type { get; set; }
/// <summary>
/// 描述
/// </summary>
[DisplayName("描述")]
public string description { get; set; }
/// <summary>
/// 备注
/// </summary>
[DisplayName("备注")]
public string remark { get; set; }
}
/// <summary>
/// 测试枚举
/// </summary>
public enum EnumTest
{
/// <summary>
/// 测试
/// </summary>
测试 = 1,
/// <summary>
/// 测试项
/// </summary>
测试项 = 2
}
手动添加列
//info为数据集合
//List<Test> info = new List<Test>();
PropertyInfo[] pros = infos[0].GetType().GetProperties();
foreach (PropertyInfo item in pros)
{
var info = item.GetCustomAttribute<DisplayNameAttribute>();
var infoable = item.GetCustomAttribute<BrowsableAttribute>();
string colName = info.DisplayName;
if (infoable != null && !infoable.Browsable)
{
continue;
}
DataGridViewColumn dgvc = null;
if (item.PropertyType.IsEnum)
{
//设置为枚举列
dgvc = new DataGridViewComboBoxColumn();
Dictionary<int, string> dic = SymTblHelp.EnumToDictionary(item.PropertyType);
((DataGridViewComboBoxColumn)dgvc).DataSource = Enum.GetValues(item.PropertyType);
((DataGridViewComboBoxColumn)dgvc).DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
((DataGridViewComboBoxColumn)dgvc).FlatStyle = FlatStyle.Flat;
}
else if (item.PropertyType == typeof(bool))
{
//bool类型
dgvc = new DataGridViewCheckBoxColumn();
}
else
{
//常规类型
dgvc = new DataGridViewTextBoxColumn();
dgvc=new datagridchec
}
dgvc.Name = colName;
dgvc.DataPropertyName = item.Name;// 保证该列的值绑定到DataTable中colName列上
dgvc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dgvc.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView2.Columns.Add(dgvc);
}