我有一个动态数据列表,其中包含由 PIVOT 函数创建的动态列数。一切或多或少都有效,但我想对某些列应用一些自定义格式。我想出了如何通过只取第一行并将其转换为这样来获取列列表:
var columns = Model.Comparisons.Select(x => x).FirstOrDefault() as IDictionary<string, object>;
接下来,我决定通过循环“列”来创建我的列表,只要我直接通过动态字段名称引用“格式:”子句中的动态字段,它就可以工作,例如:
foreach (var c in columns)
{
switch (c.Key)
{
case "Cost":
cols.Add(grid.Column(
columnName: c.Key,
header: c.Key,
format: (item) => Convert.ToDecimal(item.Cost).ToString("C")));
break;
default:
cols.Add(grid.Column(columnName: c.Key, header: c.Key, format: item => item[c.Key]));
break;
}
}
“默认”不会动态获取每条记录的值。我相信这与“item [c.Key]”与 item.Cost 有关。问题是我不想为每个字段编写不同的大小写,主要是因为我不提前知道它们,因为数据可能会发生变化。大约有 6 个字段将始终存在。但是我确实知道数据类型,这就是为什么我想在它们上放置自定义格式。
编辑
我设法通过编写扩展方法来解决这个问题。
public static class DynamicDataHelper
{
public static WebGridColumn GetColumn(this HtmlHelper helper, string vendor)
{
return new WebGridColumn()
{
ColumnName = vendor,
Header = vendor,
Format = (item) => helper.ActionLink(
(string)Convert.ToDecimal(item[vendor]).ToString("C"),
"VendorSearch",
"Compare",
new { Vendor = vendor, mpn = item.MPN },
new { target = "_blank" })
};
}
}