0

I have a dynamic list of data with a dynamic number of columns being created by a PIVOT function. Everything more or less works, but I wanted to apply some custom formatting to some of the columns. I figured out how to get a list of the columns by just taking the first row and casting it like so:

var columns = Model.Comparisons.Select(x => x).FirstOrDefault() as IDictionary<string, object>;

Next I decided to create my List by looping over the "columns", which works as long as I reference the dynamic fields in the "format:" clause by their dynamic field name directly for example:

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;
    }
}

The "default" does not dynamically get the value of each record. I believe it has to do with the "item[c.Key]" vs item.Cost. The problem is I don't want to have to write different case for each field, primarily because I don't know them ahead of time as the data can change. There are about 6 fields that will always be present. I do know however the datatype, which is why I wanted to put a custom format on them.

EDIT

I managed to solve this by writing an extension method.

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" })
        };
    }
}
ewahner
  • 1,149
  • 2
  • 11
  • 23

1 Answers1

0

I edited my post with the Html Helper that I wrote that will in effect build the custom WebGridColumn objects I was having problems with. The "vendor" is passed in from the View and is then resolved at runtime. It works great.

ewahner
  • 1,149
  • 2
  • 11
  • 23