C# DataGridView快速赋值方式。
原先使用手动赋值效率低下,使用DataSource绑定数据源不能灵活改变vlaue的值。
现在使用自动赋值并增加回调方法来实现快速赋值,是否具有更先进的方式我不知道。
1.把List赋值到GridView
/// <summary>
/// 把List赋值到GridView
/// </summary>
/// <typeparam name="T">集合类型</typeparam>
/// <param name="lst">集合</param>
/// <param name="GV">GridView</param>
/// <param name="action">委托默认为null</param>
/// <param name="preString">GridView列名前缀默认为空</param>
public static void Object2GirdView<T>(List<T> lst, DataGridView gv, Action<DataGridViewRow> action = null, string preString = "")
{
var tInType = lst[0].GetType();
string columnName;//GridView列名
DataGridViewRow row;
foreach (T t in lst)
{
gv.Rows.Add();
row = gv.Rows[gv.Rows.Count - 1];
foreach (var itemOut in t.GetType().GetProperties())
{
var itemIn = tInType.GetProperty(itemOut.Name);
columnName = preString + itemOut.Name;
if (gv.Columns[columnName] != null)
{
row.Cells[columnName].Value = itemIn.GetValue(t, null);
}
}
//调用委托
if (action != null)
action(row);
}
}
2.把DataTable赋值到GridView
/// <summary>
/// 把DataTable赋值到GridView
/// </summary>
/// <param name="dt">DataTable数据源</param>
/// <param name="gv">GridView</param>
/// <param name="action">委托默认为null</param>
/// <param name="preString">GridView列名前缀默认为空</param>
public static void DataTable2GirdView(DataTable dt, DataGridView gv, Action<DataGridViewRow> action = null, string preString = "")
{
string columnName;//GridView列名
DataGridViewRow row;
DataRow dr;
for (int i = 0; i < dt.Rows.Count; i++)
{
gv.Rows.Add();
row = gv.Rows[gv.Rows.Count - 1];
dr = dt.Rows[i];
foreach (DataColumn dataColumn in dt.Columns)
{
columnName = preString + dataColumn.ToString();
if (gv.Columns[columnName] != null)
{
row.Cells[columnName].Value = dr[dataColumn];
}
}
//调用委托
if (action != null)
action(row);
}
}
调用方法
//回调函数
Action<DataGridViewRow> action = row =>
{
row.Cells[preGV + GeneralClass.GetMemberName(() =>
selModel.ActionCode)].Value =
(ActionTypeEnum)int.Parse(row.Cells[preGV+GeneralClass.GetMemberName(()
=> selModel.ActionCode)].Value.ToString());
};
//调用方式
Object2GirdView<AuxiliaryStockLogModel>(lst, GV, action, preGV);
需要注意GridView的列名和数据源的列名匹配,以下是我使用的一种方式。
/// <summary>
/// 获取变量名称字符串
/// </summary>
public static string GetMemberName<T>(Expression<Func<T>> memberExpression)
{
MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
return expressionBody.Member.Name;
}
private void SetGVColumn()
{
GV.Columns.Add(GetMemberName(() => model.AuxLogId), "序号");
GV.Columns.Add(GetMemberName(() => model.ActionCode), "类型");
}