Skip to content

Commit cfc833e

Browse files
authored
GridView DataSource should be of type object (#193)
* GridView DataSource should be of type object * AsDynamicEnumerable() should be internal * Support DataSet
1 parent 8bd27b9 commit cfc833e

File tree

4 files changed

+81
-14
lines changed

4 files changed

+81
-14
lines changed

src/BlazorWebFormsComponents.Test/GridView/DataTableSupport.razor

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
@using System.Data
2-
@using BlazorWebFormsComponents.Extensions
32
@inherits TestComponentBase
43

54
<Fixture Test="DataTableAsDataSourceWithAutoGenerateColumns">
65
<ComponentUnderTest>
7-
<GridView DataSource="dataTable.AsDynamicEnumerable()" AutogenerateColumns="true">
6+
<GridView ItemType="dynamic" DataSource="dataTable" AutogenerateColumns="true">
87
</GridView>
98
</ComponentUnderTest>
109
</Fixture>
1110

1211
<Fixture Test="DataTableAsDataSourceWithoutAutoGenerateColumns">
1312
<ComponentUnderTest>
14-
<GridView ItemType="dynamic" DataSource="dataTable.AsDynamicEnumerable()" AutogenerateColumns="false">
13+
<GridView ItemType="dynamic" DataSource="dataTable" AutogenerateColumns="false">
1514
<Columns>
1615
<BoundField ItemType="dynamic" DataField="Name" HeaderText="Item Name" />
1716
<BoundField ItemType="dynamic" DataField="Quantity" HeaderText="Item Quantity" />
@@ -20,16 +19,36 @@
2019
</ComponentUnderTest>
2120
</Fixture>
2221

23-
<Fixture Test="DataTableAsDataSource">
22+
<Fixture Test="DataTableWithEnumerableOfDataRowAsDataSource">
2423
<ComponentUnderTest>
25-
<GridView DataSource="dataTable.AsEnumerable()" AutogenerateColumns="true">
24+
<GridView ItemType="dynamic" DataSource="dataTable.AsEnumerable()" AutogenerateColumns="true">
25+
</GridView>
26+
</ComponentUnderTest>
27+
</Fixture>
28+
29+
<Fixture Test="DataSetAsDataSource">
30+
<ComponentUnderTest>
31+
<GridView ItemType="dynamic" DataSource="dataSet" AutogenerateColumns="true">
2632
</GridView>
2733
</ComponentUnderTest>
2834
</Fixture>
2935

3036
@code {
37+
DataSet dataSet = new DataSet();
3138
DataTable dataTable = new DataTable();
3239

40+
void DataSetAsDataSource(Fixture fixture)
41+
{
42+
dataSet = GetDataSet();
43+
44+
var cut = fixture.GetComponentUnderTest();
45+
var tableHeaders = cut.FindAll("th");
46+
tableHeaders[0].TextContent.ShouldBe("Id");
47+
tableHeaders[1].TextContent.ShouldBe("Name");
48+
tableHeaders[2].TextContent.ShouldBe("Quantity");
49+
tableHeaders.Count.ShouldBe(3, "Did not render 3 TH elements");
50+
}
51+
3352
void DataTableAsDataSourceWithAutoGenerateColumns(Fixture fixture)
3453
{
3554
dataTable = GetDataTable();
@@ -53,7 +72,7 @@
5372
tableHeaders.Count.ShouldBe(2, "Did not render 2 TH elements");
5473
}
5574

56-
void DataTableAsDataSource(Fixture fixture)
75+
void DataTableWithEnumerableOfDataRowAsDataSource(Fixture fixture)
5776
{
5877
dataTable = GetDataTable();
5978

@@ -67,6 +86,14 @@
6786
tableHeaders.Count.ShouldBe(5, "Did not render 5 TH elements");
6887
}
6988

89+
DataSet GetDataSet()
90+
{
91+
var dataTable1 = GetDataTable();
92+
dataSet.Tables.Add(dataTable1);
93+
94+
return dataSet;
95+
}
96+
7097
DataTable GetDataTable()
7198
{
7299
dataTable.Columns.AddRange(new DataColumn[3]

src/BlazorWebFormsComponents/BaseModelBindingComponent.cs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
using Microsoft.AspNetCore.Components;
1+
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
4+
using System.Data;
35
using System.Linq;
6+
using Microsoft.AspNetCore.Components;
7+
using BlazorWebFormsComponents.Extensions;
48

59
namespace BlazorWebFormsComponents
610
{
@@ -28,12 +32,21 @@ public IEnumerable<ItemType> Items {
2832
protected List<ItemType> ItemsList { get; set; }
2933

3034
[Parameter]
31-
public IEnumerable<ItemType> DataSource
35+
public object DataSource
3236
{
3337
get { return Items; }
34-
set {
35-
Items = value;
36-
this.StateHasChanged();
38+
set
39+
{
40+
if (!typeof(IEnumerable).IsAssignableFrom(value.GetType()) && value.GetType() != typeof(DataSet) && value.GetType() != typeof(DataTable))
41+
{
42+
throw new InvalidOperationException("The DataSource must have an object of type IEnumerable, DataSet or DataTable.");
43+
}
44+
45+
TryBindToDataSet(ref value);
46+
TryBindToDataTable(ref value);
47+
48+
Items = value as IEnumerable<ItemType>;
49+
this.StateHasChanged();
3750
}
3851
}
3952

@@ -52,6 +65,30 @@ protected override void OnAfterRender(bool firstRender)
5265

5366
}
5467

68+
private static void TryBindToDataSet(ref object value)
69+
{
70+
if (value.GetType() == typeof(DataSet))
71+
{
72+
var dataSet = (value as DataSet);
73+
if (dataSet.Tables.Count > 0)
74+
{
75+
value = (dataSet.Tables[0] as object as DataTable).AsDynamicEnumerable();
76+
}
77+
else
78+
{
79+
value = Enumerable.Empty<ItemType>();
80+
}
81+
}
82+
}
83+
84+
private static void TryBindToDataTable(ref object value)
85+
{
86+
if (value.GetType() == typeof(DataTable))
87+
{
88+
value = (value as DataTable).AsDynamicEnumerable();
89+
}
90+
}
91+
5592
}
5693

5794
}

src/BlazorWebFormsComponents/Extensions/DataTableExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace BlazorWebFormsComponents.Extensions
99
{
1010
public static class DataTableExtensions
1111
{
12-
public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
12+
internal static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
1313
{
1414
if (table == null)
1515
{

src/BlazorWebFormsComponents/GridViewColumnGenerator.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Linq;
1+
using System.Collections.Generic;
2+
using System.Linq;
23
using System.Reflection;
34

45
namespace BlazorWebFormsComponents
@@ -21,7 +22,9 @@ public static void GenerateColumns<ItemType>(GridView<ItemType> gridView)
2122
var propertiesInfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
2223
if (propertiesInfo.Count() == 0)
2324
{
24-
propertiesInfo = gridView.DataSource.First()?.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) ?? Enumerable.Empty<PropertyInfo>().ToArray();
25+
propertiesInfo = (gridView.DataSource as IEnumerable<ItemType>).First()?.GetType()
26+
.GetProperties(BindingFlags.Instance | BindingFlags.Public) ?? Enumerable.Empty<PropertyInfo>()
27+
.ToArray();
2528
}
2629

2730
foreach (var propertyInfo in propertiesInfo.Where(p => p.Name != IndexerPropertyName).OrderBy(x => x.MetadataToken))

0 commit comments

Comments
 (0)