Ситуация: У меня есть несколько Gridviews на одной странице, и у каждого Gridview есть динамически созданная строка, отображающая итоговые значения внизу. В каждом случае строка итогов создается в событии RowDataBound. Стратегия, которую я использую, подобна той, которую предоставил Майк Дуган на своем Blog.Динамически созданные строки исчезают из Gridviews при обновлении/удалении
Ниже приведен код для одного из GridViews, но остальные все делают что-то очень симулятивное.
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);
}
Проблема: Если пользователь нажимает на редактирование/удаление команды для любой строки на любой из этих GridViews, он будет делать итоговые строки исчезают для всех остальных GridViews. Насколько я понимаю, это происходит потому, что происходит PostBack, однако события RowDataBound не будут встречаться для других GridView, а они просто перезагружают свои данные из ViewState, которые не содержат итоговые значения.
Неудачные попытки решения: Я не могу просто вызвать DataBind для каждого из GridView во время PostBack, потому что это предотвратит появление обновления/удаления. Хотя событие RowCreated будет происходить для GridViews во время PostBack, этого события недостаточно, потому что GridViews не будет привязан к данным и будет генерировать исключение, когда я попытаюсь вычислить общее количество. Отключение ViewState для этих GridViews похоже на решение, однако будет много данных для перезагрузки при каждом нажатии пользователем команды. Ручное сохранение моих данных в ViewState также похоже на решение, но, похоже, нет простого способа заставить GridViews получить эти пользовательские данные в PostBack.
Есть ли способ достичь того, что я пытаюсь сделать с ASP.NET? Похоже, простое требование иметь итоговую строку в нижней части каждого GridView.
Заранее благодарим за любую помощь.
Вы рассматривали использование ajax или updatepanel только для обновления того, что хотите? –
Я еще не пробовал использовать UpdatePanel, хотя вся страница уже завернута в UpdatePanel, чтобы сохранить позицию прокрутки в PostBacks. Я сделаю это. –
Пробовал обернуть один из GridViews в UpdatePanel, но его итоговая строка исчезла, когда я нажал на другие команды GridView. –