WebDataGrid1.Behaviors.CreateBehavior<SummaryRow>();
バンドの列フッターを有効にするとフッターが表示されますが、フッターに含める情報を指定する必要があります。これは、UltraGridColumn.FooterText
プロパティおよび UltraGridColumn.FooterTotal
プロパティ(あるいはそのいずれか一方)を介して実行できます。
このセクションの興味深いヒント:
WebDataGrid では、数値データの集計を任意の列に表示できます。
次の集計ができます。
カウント
合計値
平均
最小値
最大値
カスタム集計
標準集計は、数値データのみに使用可能です。例外は、常に使用可能なカウントの SummaryType です。
C# の場合:
WebDataGrid1.Behaviors.CreateBehavior<SummaryRow>();
有効な場合、動作は各ヘッダーに集計ボタンを追加します。このボタンを押すと、使用可能な集計を示すドロップダウンが表示されます。
ASPX の場合:
<Behaviors>
<ig:SummaryRow AnimationType="Linear">
<ColumnSummaries>
<ig:ColumnSummaryInfo ColumnKey="UnitPrice">
<Summaries>
<ig:Summary SummaryType="Average" />
<ig:Summary SummaryType="Max" />
</Summaries>
</ig:ColumnSummaryInfo>
</ColumnSummaries>
</ig:SummaryRow>
</Behaviors>
コード ビハインドから集計行を追加するには、次のコードを追加します。
C# の場合:
ColumnSummaryInfo unitPriceSummary = new ColumnSummaryInfo();
unitPriceSummary.ColumnKey = "UnitPrice";
unitPriceSummary.Summaries.Add(SummaryType.Average);
unitPriceSummary.Summaries.Add(SummaryType.Max);
WebDataGrid1.Behaviors.SummaryRow.ColumnSummaries.Add(unitPriceSummary);
集計行の動作が有効な場合、集計ボタンはすべての列のヘッダーに表示されます。このボタンを押すと、使用可能な集計を示すドロップダウンが発生します。集計を選択すると、新しい行(集計行)がグリッドのフッターに表示され、集計値が表示されます。
集計オプションから集計と列の集計ボタンを無効にし、集計値の文字列を書式設定することができます。
ShowSummaryButton
を「False」に設定します。この方法では、列の集計ボタン(集計のリストを表示する)がヘッダーに表示されません。このレベルから使用できる他のプロパティは次のとおりです。
EnableColumnSummaryOptions
– 「False」に設定されていると、デフォルトの集計タイプはドロップダウンで使用できません。
Enabled
– 「False」に設定されていると、ユーザーはこの列の集計を計算できません。
次のマークアップを生成する必要があります。
ASPX の場合:
<Behaviors>
<ig:SummaryRow>
<ColumnSummaries>
<ig:ColumnSummaryInfo ColumnKey="UnitPrice">
<Summaries>
<ig:Summary SummaryType="Average" />
</Summaries>
</ig:ColumnSummaryInfo>
</ColumnSummaries>
<ColumnSettings>
<ig:SummaryRowSetting ColumnKey="ProductID" ShowSummaryButton="False">
</ig:SummaryRowSetting>
<ig:SummaryRowSetting ColumnKey="UnitPrice">
<SummarySettings>
<ig:SummarySetting ShowOptionInDropDown="False"SummaryType="Max" />
<ig:SumarySetting FormatString="{0} = {1:###.00}"
SummaryType="Average" />
</SummarySettings>
</ig:SummaryRowSetting>
</ColumnSettings>
</ig:SummaryRow>
</Behaviors>
コード ビハインドから実行する場合は、次のコードを追加します。
C# の場合:
SummaryRowSetting settings = new SummaryRowSetting(WebDataGrid1, "ProductID");
settings.ShowSummaryButton = false;
this.WebDataGrid1.Behaviors.SummaryRow.ColumnSettings.Add(settings);
SummaryRowSetting unitPriceSetting = new SummaryRowSetting(WebDataGrid1, "UnitPrice");
SummarySetting maxSummarySetting = new SummarySetting();
maxSummarySetting.ShowOptionInDropDown = false;
maxSummarySetting.SummaryType = SummaryType.Max;
unitPriceSetting.SummarySettings.Add(maxSummarySetting);
SummarySetting averegeSummarySetting = new SummarySetting();
averegeSummarySetting.FormatString = "{0} = {1:###.00}";
averegeSummarySetting.SummaryType = SummaryType.Average;
unitPriceSetting.SummarySettings.Add(averegeSummarySetting);
this.WebDataGrid1.Behaviors.SummaryRow.ColumnSettings.Add(unitPriceSetting);
ASPX の場合:
<Behaviors>
<ig:FooterSummaries AnimationType="Bounce">
<ColumnSummaries>
<ig:ColumnSummaryInfo ColumnKey="UnitPrice">
<Summaries>
<ig:Summary SummaryType="Custom" CustomSummaryName="STDEV" />
</Summaries>
</ig:ColumnSummaryInfo>
</ColumnSummaries>
<ColumnSettings>
<ig:FooterSummariesSetting ColumnKey="UnitPrice">
<SummarySettings>
<ig:SummarySetting CustomSummaryName="Standard Deviation" SummaryType="Custom" />
</SummarySettings>
</ig:FooterSummariesSetting>
</ColumnSettings>
</ig:FooterSummaries>
</Behaviors>
次に示すコードは、コード ビハインドからカスタム集計を追加する方法です。
C# の場合:
FooterSummariesSetting unitPriceSetting = new FooterSummariesSetting(this.WebDataGrid1, "UnitPrice");
SummarySetting stdevSetting = new SummarySetting();
stdevSetting.SummaryType = SummaryType.Custom;
stdevSetting.CustomSummaryName = "STDEV";
stdevSetting.FormatString = "STDEV = {1}";
unitPriceSetting.SummarySettings.Add(stdevSetting);
WebDataGrid1.Behaviors.FooterSummaries.ColumnSettings.Add(unitPriceSetting);
ColumnSummaryInfo stdevInfo = new ColumnSummaryInfo();
stdevInfo.ColumnKey = "UnitPrice";
Summary stdevSummary = new Summary();
stdevSummary.SummaryType = SummaryType.Custom;
stdevSummary.CustomSummaryName = "STDEV";
stdevInfo.Summaries.Add(stdevSummary);
WebDataGrid1.Behaviors.FooterSummaries.ColumnSummaries.Add(stdevInfo);
protected object WebDataGrid1_CalculateCustomSummary(object sender, CustomSummaryEventArgs e)
{
// St.dev 集計を計算する
if (e.Summary.CustomSummaryName == "STDEV")
{
// すべての値の合計を計算する
double sum = 0.0;
int n = 0;
foreach (GridRecord gr in this.WebDataGrid1.Rows)
{
sum += Convert.ToDouble(gr.Items[2].Value);
++n;
}
// 偏差平方和を計算する
double mean = sum / n;
sum = 0;
foreach (GridRecord gr in this.WebDataGrid1.Rows)
{
sum += Math.Pow(mean - Convert.ToDouble(gr.Items[2].Value), 2);
}
sum = sum / (n - 1);
return Math.Round(Math.Sqrt(sum), 2);
}
return null;
}
集計、サマリー行とフィルタリング動作が有効な場合は、フィルターされたデータの集計値を計算できます。EnableSummariesFilter
と呼ばれるプロパティが、集計を計算する方法を指定します。
このプロパティを「True」に設定した場合、集計の計算には、グリッドのフィルタリング動作で適用されたフィルタリング条件によって絞り込まれていないデータが使用されます。プロパティが「False」に設定された場合は、フィルター アウトに関係なく、集計は完全なデータに基づいて計算されます。
注: フィルターされたデータ、または編集されたデータを除き、集計は常にデータ全体について計算されます。つまり、グリッドのデータを編集(CRUD)またはフィルターすると、集計値はフィルターされたデータ、または編集されたデータについて計算されます。他の動作(ページング、スクローリングなど)の場合、計算された集計値はデータ全体に対応します。
JavaScript の場合:
function SummaryCalculated(sender, evntArgs) {
var summariesText = " ";
var columnSummaryInfo = evntArgs.get_columnSummaryInfo();
var columnKey = columnSummaryInfo.get_columnKey();
var count = columnSummaryInfo.get_summaryCount();
for (var i = 0; i <= 5; i++) {
var summary = columnSummaryInfo.get_summaryByType(i);
if (summary != null) {
summariesText += getSummaryType(i) + " = " + summary.get_value() + "; ";
}
}
alert ("SummaryCalculated Event Fired for Column " + columnKey + ": " + summariesText);
}
function getSummaryType(summaryTypeIndex) {
switch (summaryTypeIndex) {
case 0:
return "Count";
case 1:
return "Min";
case 2:
return "Max";
case 3:
return "Average";
case 4:
return "Sum";
case 5:
return "Custom";
}
}
C# の場合:
protected object WebDataGrid1_CalculateCustomSummary(object sender, CustomSummaryEventArgs e)
{
switch (e.ColumnSummaryInfo.ColumnKey)
{
case "UnitPrice":
return this.CalcStDev(2);
case "UnitsInStock":
return this.CalcStDev(3);
case "UnitsOnOrder":
return this.CalcStDev(4);
default:
return null;
}
}
protected double CalcStDev(int colNumber)
{
double sum = 0.0;
int n = 0;
foreach (GridRecord gr in this.WebDataGrid1.Rows)
{
sum += Convert.ToDouble(gr.Items[colNumber].Value);
++n;
}
//偏差平方和を計算する
double mean = sum / n;
sum = 0;
foreach (GridRecord gr in this.WebDataGrid1.Rows)
{
sum += Math.Pow(mean - Convert.ToDouble(gr.Items[colNumber].Value), 2);
}
sum = sum / (n - 1);
return Math.Round(Math.Sqrt(sum), 2);
}
WebDataGrid の集計列機能は、WebHierarchicalDataGrid で使用できます。この動作によって、標準集計(カウント、合計値、平均、最小値、最大値)およびカスタム集計の追加が可能になります。
WebHierarchicalDataGrid の各バンドに、集計列の動作を割り当てることができます。子バンドが設定を継承できるように、バンドの [EnableInheritance] プロパティを設定できます。これによって、データの各バンドで集計行の動作をカスタマイズできます。たとえば、WebHierarchicalDataGrid のすべてのバンドの集計が必要な場合は、ルート レベルで SummaryRow 動作を有効にし、EnableInheritance を「True」に設定するだけです。特定の子バンドの動作を無効にする場合は、その特定のバンドの動作を無効にします。
有効な場合、動作は各ヘッダーに集計ボタンを追加します。このボタンを押すと、使用可能な集計を示すドロップダウンが表示されます。
ASPX の場合:
<ig:WebHierarchicalDataGrid ID="WebHierarchicalDataGrid1" runat="server" DataSourceID="WebHierarchicalDataSource1"
Height="400px" Width="750px" DataKeyFields="ProductID" >
<Bands>
<ig:Band Height="100" DataMember="AccessDataSource1_Orders" DataKeyFields="OrderID">
<Behaviors>
<ig:SummaryRow>
<ColumnSummaries>
<ig:ColumnSummaryInfo ColumnKey="Quantity">
<Summaries>
<ig:Summary SummaryType="Sum"></ig:Summary>
</Summaries>
</ig:ColumnSummaryInfo>
</ColumnSummaries>
</ig:SummaryRow>
</Behaviors>
</ig:Band>
</Bands>
<Behaviors>
<ig:SummaryRow EnableInheritance="true">
<ColumnSummaries>
<ig:ColumnSummaryInfo ColumnKey="UnitPrice">
<Summaries>
<ig:Summary SummaryType="Average"></ig:Summary>
</Summaries>
</ig:ColumnSummaryInfo>
</ColumnSummaries>
</ig:SummaryRow>
</Behaviors>
</ig:WebHierarchicalDataGrid>
C# の場合:
protected void WebHierarchicalDataGrid1_InitializeBand(object sender, BandEventArgs e)
{
if (e.Band.Key == "Products")
{
e.Band.Behaviors.CreateBehavior<SummaryRow>();
e.Band.Behaviors.SummaryRow.EnableInheritance = true;
ColumnSummaryInfo unitPriceSummary = new ColumnSummaryInfo();
unitPriceSummary.ColumnKey = "UnitPrice";
unitPriceSummary.Summaries.Add(SummaryType.Average);
e.Band.Behaviors.SummaryRow.ColumnSummaries.Add(unitPriceSummary);
this.WebHierarchicalDataGrid1.RefreshBehaviors();
}
else if (e.Band.Key == "Orders")
{
e.Band.Behaviors.CreateBehavior<SummaryRow>();
e.Band.Behaviors.SummaryRow.EnableInheritance = true;
ColumnSummaryInfo quantitySummary = new ColumnSummaryInfo();
quantitySummary.ColumnKey = "Quantity";
quantitySummary.Summaries.Add(SummaryType.Sum);
quantitySummary.Summaries.Add(SummaryType.Max);
e.Band.Behaviors.SummaryRow.ColumnSummaries.Add(quantitySummary);
this.WebHierarchicalDataGrid1.RefreshBehaviors();
}
}
デフォルトで、集計はテンプレート列にサポートされません。
これは、カスタム集計によって実装される必要があります。
ASPX の場合:
<ig:WebHierarchicalDataGrid ID="WebHierarchicalDataGrid1" runat="server" Height="350px" AutoGenerateColumns="false"
Width="800px" AutoGenerateBands="false" AutoGenerateColumns="false" DataKeyFields="ID"
DataMember="SqlDataSource1_DefaultView" DataSourceID="WebHierarchicalDataSource1"
Key="SqlDataSource1_DefaultView" OnCalculateCustomSummary="WebHierarchicalDataGrid1_CalculateCustomSummary">
<Bands>
<ig:Band AutoGenerateColumns="False" DataMember="SqlDataSource2_DefaultView" Key="SqlDataSource2_DefaultView"
OnCalculateCustomSummary="WebHierarchicalDataGrid1_CalculateCustomSummary" ShowFooter="true">
<Columns>
<ig:BoundDataField DataFieldName="ProductID" Key="ProductID">
<Header Text="ProductID" />
</ig:BoundDataField>
<ig:BoundDataField DataFieldName="ProductName" Key="ProductName">
<Header Text="ProductName" />
</ig:BoundDataField>
<ig:BoundDataField DataFieldName="CategoryID" Key="CategoryID">
<Header Text="CategoryID" />
</ig:BoundDataField>
<ig:TemplateDataField Key="UnitPrice">
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# DataBinder.Eval(((Infragistics.Web.UI.TemplateContainer)Container).DataItem, "UnitPrice")%'>
</asp:Label>
</ItemTemplate>
<Footer Text="" />
<Header Text="UnitPrice" />
</ig:TemplateDataField>
</Columns>
<Behaviors>
<ig:SummaryRow>
<ColumnSettings>
<ig:SummaryRowSetting ColumnKey="UnitPrice" EnableColumnSummaryOptions="true" Enabled="true"
ShowSummaryButton="true">
<SummarySettings>
<ig:SummarySetting SummaryType="Custom" CustomSummaryName="Sum of Unit Prices" ShowOptionInDropDown="true" />
</SummarySettings>
</ig:SummaryRowSetting>
</ColumnSettings>
</ig:SummaryRow>
</Behaviors>
</ig:Band>
</Bands>
<Behaviors>
<ig:SummaryRow EnableInheritance="True">
<ColumnSettings>
<ig:SummaryRowSetting ColumnKey="CategoryName">
<SummarySettings>
<ig:SummarySetting CustomSummaryName="Count of CategoryName" SummaryType="Custom" />
</SummarySettings>
</ig:SummaryRowSetting>
</ColumnSettings>
</ig:SummaryRow>
</Behaviors>
<Columns>
<ig:BoundDataField DataFieldName="CategoryID" Key="CategoryID">
<Header Text="CategoryID" />
</ig:BoundDataField>
<ig:TemplateDataField Key="CategoryName">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# DataBinder.Eval(((Infragistics.Web.UI.TemplateContainer)Container).DataItem, "CategoryName") %>'
CssClass="redCategories">
</asp:Label>
</ItemTemplate>
<Header Text="CategoryName" />
<Footer />
</ig:TemplateDataField>
<ig:BoundDataField DataFieldName="Description" Key="Description">
<Header Text="Description" />
</ig:BoundDataField>
</Columns>
</ig:WebHierarchicalDataGrid>
C# の場合:
protected object WebHierarchicalDataGrid1_CalculateCustomSummary(object sender, Infragistics.Web.UI.GridControls.CustomSummaryEventArgs e)
{
object summary = 0;
if (e.ColumnSummaryInfo.ColumnKey == "UnitPrice")
{
// すべての値の合計を計算する
Decimal sum = Decimal.Parse(summary.ToString());
ContainerGrid childGrid = (ContainerGrid)sender;
foreach (GridRecord gr in childGrid.Rows)
{
Label label = (Label)gr.Items[3].FindControl("Label1");
sum += Decimal.Parse(label.Text);
}
summary = sum;
}
if (e.ColumnSummaryInfo.ColumnKey == "CategoryName")
{
int count = (int)summary;
// すべての値のカウントを計算する
ContainerGrid childGrid = (ContainerGrid)sender;
count = childGrid.Rows.Count;
summary = count;
}
return summary;
}