グリッドビューに2つのイベントリスナー、onRowDataBoundとonDataBoundを追加することで、最初の部分を実行できました。
これは、このメソッドに対する私のコードです。
protected void GridViewOnRowDataBound(object sender, GridViewRowEventArgs e)
{
int i=0;
if (sender == GridView1)
i = 0;
else if (sender == GridView2)
i = 1;
if (e.Row.RowType == DataControlRowType.DataRow)
{
SumaSpraw[i] += Convert.ToInt32(((Label)e.Row.FindControl("sprawy")).Text);
SumaAdresow[i] += Convert.ToInt32(((Label)e.Row.FindControl("adresy")).Text);
SumaInPost[i] += Convert.ToInt32(((Label)e.Row.FindControl("inpost")).Text);
SumaPoczta[i] += Convert.ToInt32(((Label)e.Row.FindControl("poczta")).Text);
}
if (e.Row.RowType == DataControlRowType.Footer)
{
((Label)e.Row.FindControl("sumaSpraw")).Text = SumaSpraw[i].ToString("N0");
((Label)e.Row.FindControl("sumaAdresow")).Text = SumaAdresow[i].ToString("N0");
((Label)e.Row.FindControl("sumaInPost")).Text = SumaInPost[i].ToString("N0");
((Label)e.Row.FindControl("sumaPoczta")).Text = SumaPoczta[i].ToString("N0");
}
}
protected void GridViewOnDataBound(object sender, EventArgs e)
{
int i = 0;
if (sender == GridView1)
i = 0;
else if (sender == GridView2)
i = 1;
decimal percent = 0M;
foreach (GridViewRow row in ((GridView)sender).Rows)
{
percent = (Convert.ToInt32(((Label)row.FindControl("adresy")).Text) / SumaAdresow[i]) * 100;
((Label)row.FindControl("procentAdresow")).Text = FormatPercent(Math.Round(percent, 2));
percent = (Convert.ToInt32(((Label)row.FindControl("inpost")).Text) / SumaInPost[i]) * 100;
((Label)row.FindControl("procentInPost")).Text = FormatPercent(Math.Round(percent, 2));
percent = (Convert.ToInt32(((Label)row.FindControl("poczta")).Text) / SumaPoczta[i]) * 100;
((Label)row.FindControl("procentPoczta")).Text = FormatPercent(Math.Round(percent, 2));
}
}
protected string FormatPercent(decimal percent)
{
if (percent == decimal.Truncate(percent))
{
return percent.ToString("N0") + "%";
}
else if (percent * 10 == decimal.Truncate(percent * 10))
{
return percent.ToString("N1") + "%";
}
else if (percent*100 == decimal.Truncate(percent*100))
{
return percent.ToString("N2") + "%";
}
else
return percent.ToString("N0") + "%";
}
3番目の方法は、出力のフォーマットに使用されます。
しかし、それでも私は2番目の部分について疑問に思っています-2つの行から2つのセルだけをマージする方法(私の2番目の画面のように)。
スタイリング部分は完了しました。たぶんコードはそれほど素晴らしく見えませんが、それは機能します:)
public static void GridViewRowMerger(GridView gridView, int collIndex)
{
for (int rowIndex = gridView.Rows.Count - 2; rowIndex >= 0; rowIndex--)
{
GridViewRow currentRow = gridView.Rows[rowIndex];
GridViewRow previousRow = gridView.Rows[rowIndex + 1];
if (currentRow.Cells[collIndex].Text != previousRow.Cells[collIndex].Text) continue;
if (previousRow.Cells[collIndex].RowSpan < 2)
{
currentRow.Cells[collIndex].RowSpan = 2;
}
else
currentRow.Cells[collIndex].RowSpan = previousRow.Cells[collIndex].RowSpan + 1;
previousRow.Cells[collIndex].Visible = false;
}
}
public static void GridViewRefreshStyle(GridView gridView, int collIndex)
{
int rows = 0;
for (int rowIndex = 0; rowIndex < gridView.Rows.Count; rowIndex++)
{
if (gridView.Rows[rowIndex].Cells[collIndex].RowSpan > 1)
{
for (int i = 0; i < gridView.Rows[rowIndex].Cells[collIndex].RowSpan; i++)
{
gridView.Rows[rowIndex + i].CssClass = rows%2 == 0
? gridView.RowStyle.CssClass
: gridView.AlternatingRowStyle.CssClass;
}
rowIndex += gridView.Rows[rowIndex].Cells[collIndex].RowSpan - 1;
}
else
{
gridView.Rows[rowIndex].CssClass = rows%2 == 0
? gridView.RowStyle.CssClass
: gridView.AlternatingRowStyle.CssClass;
}
rows++;
}
}
したがって、データをバインドした後、GridViewを実行します。これらの2つのメソッドを次のように呼び出します。
GridView2.DataSource = dSet.Tables[1];
GridView2.DataBind();
GridViewRowMerger(GridView2, 0);
GridViewRefreshStyle(GridView2, 0);