状況: 1ページに複数のGridviewがあり、各Gridviewには動的に作成された行があり、合計が下部に表示されます。いずれの場合も、合計行はRowDataBoundイベントで作成されます。私が使用している戦略は、MikeDuganが彼のブログで提供しているものと似ています。
以下は、GridViewの1つのコードですが、他のすべては非常に似たようなことをします。
protected void gvWorkerHours_RowDataBound(object sender, GridViewRowEventArgs e)
{
// Keep running total of hours.
if (e.Row.RowType == DataControlRowType.DataRow)
{
totalBillableHours += Convert.ToDouble(DataBinder.Eval(e.Row.DataItem, "Hours"));
}
if (e.Row.RowType == DataControlRowType.Footer)
{
int numColumns = gvWorkerHours.Columns.Count;
int hoursIndex = 4; //5th column, 0-based
int rowIndex = gvWorkerHours.Rows.Count + 1;
CreateTotalRow((Table)e.Row.Parent, rowIndex, totalBillableHours, hoursIndex, numColumns);
}
}
private void CreateTotalRow(Table table, int rowIndex, double totalValue, int totalIndex, int numColumns)
{
TableCell[] cells = new TableCell[numColumns];
for (int i = 0; i < numColumns; i++)
{
TableCell cell = new TableCell();
Label label = new Label();
label.Font.Bold = true;
if (i == 0)
{
label.Text = "Total";
}
else if (i == totalIndex)
{
label.Text = totalValue.ToString();
}
else
{
label.Text = "";
}
cell.Controls.Add(label);
cells[i] = cell;
}
GridViewRow row = new GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
row.Cells.AddRange(cells);
table.Rows.AddAt(rowIndex, row);
}
問題:ユーザーがこれらのグリッドビューのいずれかの行の編集/削除コマンドをクリックすると、他のすべてのグリッドビューの合計行が非表示になります。私が理解しているように、これはPostBackが発生しているためですが、RowDataBoundイベントは他のGridViewに対しては発生せず、合計を含まないViewStateからデータをリロードするだけです。
解決の試みの失敗: PostBack中に各GridViewでDataBindを呼び出すことはできません。これにより、更新/削除が発生しなくなります。PostBack中にGridViewsに対してRowCreatedイベントが発生しますが、GridViewsにはデータがバインドされておらず、合計を計算しようとすると例外がスローされるため、このイベントでは不十分です。これらのGridViewのViewStateを無効にすることは解決策のように思えますが、ユーザーがコマンドをクリックするたびにリロードするデータが大量にあります。データを手動でViewStateに保存することも解決策のようですが、GridViewにこのカスタムデータをPostBackで取得させる簡単な方法はないようです。
ASP.NETでやろうとしていることを実際に達成する方法はありますか?各GridViewの下部に合計行を配置するのは簡単な要件のようです。
助けてくれてありがとう。