BlazorTable icon indicating copy to clipboard operation
BlazorTable copied to clipboard

[Feat] Allow dynamic DataSource type to AddColumn

Open timiil opened this issue 3 years ago • 1 comments

hi , it is a nice project .

in the runtime AddColumn() mode, we must access the ITable< DataSource > instance, but in many context, we even dit not have the 'DataSource' type definition in code. it is just an ITable,


@code {

private ITable table;

...

protected override void OnAfterRender(bool firstRender)
    {
        base.OnAfterRender(firstRender);
        if (firstRender)
        {
            var col = new Column()
            {
                Title = "some desc",
                //Field = f => f.Summary,
                FieldName = "Summary",           //pls allow string field selector rather than lambda field here :)
                Sortable = true,
                Filterable = true,
                Width = "10%"
            };

            this.table.AddColumn(col);            //for now, ITable dit not have AddColumn api :(

            
        }

}

timiil avatar Sep 27 '20 09:09 timiil

I know this is an older question but perhaps it can still help someone.

I also ran into this. But i used a simple ExpressionTree to build this dynamically too. I made a little method that you can try using.

private Expression<Func<T, object>> GetFieldExpression<T>(string fieldName)
{
    var parameter = Expression.Parameter(typeof(T), "t");
    var propertyExpression = Expression.PropertyOrField(parameter, fieldName);
    return Expression.Lambda<Func<T, object>>(Expression.Convert(propertyExpression, typeof(object)), parameter);
}

In your example you can use it as follows:

var col = new Column<ColumnType>()
{
    Title ="some desc",
    Field = GetFieldExpression<ColumnType>("Summary")
};
this.table.AddColumn(col);

This works pretty well for me to load columns dynamically using reflection. Just make sure to change ColumnType to the type you are displaying in your table (ie your TableItem).

nicky-ernste avatar Aug 30 '22 13:08 nicky-ernste