-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathIndex.razor
More file actions
103 lines (94 loc) · 4.79 KB
/
Index.razor
File metadata and controls
103 lines (94 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
@page "/"
@using GridConditionalFormatting.Northwind
@using Microsoft.EntityFrameworkCore
@using System.Drawing;
@inject IDbContextFactory<NorthwindContext> NorthwindContextFactory
@implements IDisposable
<div>
<DxGrid Data="GridDataSource"
CustomizeElement="OnCustomizeElement">
<Columns>
<DxGridDataColumn FieldName="CustomerName" />
<DxGridDataColumn FieldName="UnitPrice" DisplayFormat="c" />
<DxGridDataColumn FieldName="Discount" DisplayFormat="P" />
<DxGridDataColumn FieldName="Quantity" />
<DxGridDataColumn FieldName="Total" UnboundType="GridUnboundColumnType.Decimal" UnboundExpression="UnitPrice * Quantity" DisplayFormat="c" />
</Columns>
<TotalSummary>
<DxGridSummaryItem SummaryType="GridSummaryItemType.Avg" FieldName="UnitPrice" Name="AvgUnitPrice" />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Min" FieldName="Quantity" Name="MinQuantity" Visible=false />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Max" FieldName="Quantity" Name="MaxQuantity" Visible=false />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Min" FieldName="Total" Name="MinTotal" Visible=false />
<DxGridSummaryItem SummaryType="GridSummaryItemType.Max" FieldName="Total" Name="MaxTotal" />
</TotalSummary>
</DxGrid>
</div>
@code {
IEnumerable<Invoice> GridDataSource { get; set; }
NorthwindContext Northwind { get; set; }
protected override async Task OnInitializedAsync() {
Northwind = NorthwindContextFactory.CreateDbContext();
GridDataSource = await Northwind.Invoices.ToListAsync();
}
void OnCustomizeElement(GridCustomizeElementEventArgs e) {
if (e.ElementType == GridElementType.DataCell) {
var dataColumn = (IGridDataColumn)e.Column;
switch (dataColumn.FieldName) {
case "UnitPrice":
var averageUnitPrice= Convert.ToDecimal(GetSummaryValue("AvgUnitPrice", e.Grid));
var unitPriceValue = Convert.ToDecimal(e.Grid.GetRowValue(e.VisibleIndex, "UnitPrice"));
if (unitPriceValue < averageUnitPrice)
e.CssClass = "lowUnitPrice";
else
e.CssClass = "highUnitPrice";
break;
case "Discount":
var discountValue = Convert.ToDouble(e.Grid.GetRowValue(e.VisibleIndex, "Discount"));
if (discountValue > 0)
e.Style = "background-color: #90ee90";
break;
case "Total":
int minTotal = Convert.ToInt32(GetSummaryValue("MinTotal", e.Grid));
int maxTotal = Convert.ToInt32(GetSummaryValue("MaxTotal", e.Grid));
int totalValue = Convert.ToInt32(e.Grid.GetRowValue(e.VisibleIndex, "Total"));
e.CssClass = "arrow " + GetArrowCssClass(totalValue, minTotal, maxTotal);
break;
case "Quantity":
int minQuantity = Convert.ToInt32(GetSummaryValue("MinQuantity", e.Grid));
int maxQuantity = Convert.ToInt32(GetSummaryValue("MaxQuantity", e.Grid));
int quantityValue = Convert.ToInt32(e.Grid.GetRowValue(e.VisibleIndex, "Quantity"));
Color color = GetCellColor(quantityValue, minQuantity, maxQuantity);
e.Style = "background: " + ColorTranslator.ToHtml(color);
break;
}
}
}
object GetSummaryValue(string summaryName, IGrid grid) {
var summaryItem = grid.GetTotalSummaryItems().Where(i => i.Name == summaryName).First();
return grid.GetTotalSummaryValue(summaryItem);
}
String GetArrowCssClass(int value, int min, int max) {
int firstRangeEnd = min + (max - min) / 3;
int secondRangeEnd = max - (max - min) / 3;
if (value <= firstRangeEnd)
return "arrow1";
if (value <= secondRangeEnd)
return "arrow2";
return "arrow3";
}
Color GetCellColor(int value, int min, int max) {
int average = (max + min) / 2;
int range = max - min;
double maxBrightness = 0.5;
double distanceToMean = Math.Abs(average - value) / ((double)range / 2);
double ratio = 1 - maxBrightness * distanceToMean;
if (value < average)
return Color.FromArgb(255, Convert.ToInt32(255 * ratio), Convert.ToInt32(255 * ratio));
if (value == average)
return Color.FromArgb(255, 255, 255);
return Color.FromArgb(Convert.ToInt32(255 * ratio), Convert.ToInt32(255 * ratio), 255);
}
public void Dispose() {
Northwind?.Dispose();
}
}