Массовое редактирование обновление нескольких строк в ASP.NET gridview с помощью флажков
В приведенной ниже HTML разметке у меня есть простая ASP.Net GridView с 3 столбцами.
Первый столбец содержит флажок, второй столбец содержит метку для отображения идентификатора и пути доступа к папке соответственно и третий столбец содержит метку и выпадающий список для отображения и редактирования статуса папки соответственно.
Здесь я использую GridView с подкачкой для отображения данных, и эти данные составляют около миллионов строк. Когда я нажимаю на кнопку Отправить, чтобы обновить флажок выбранные строки, время выполнения занимает слишком много времени для обновления строк в таблице.
Например: для 5000 строк = 26 мин.
Может ли кто-нибудь помочь мне решить эту проблему и сократить время выполнения, чтобы обновить все записи в течение нескольких секунд.
Что я уже пробовал:
Пожалуйста, смотрите код:
введите код здесь
&ЛТ;в ASP:GridView в идентификатор="gvACLReport" атрибут runat="сервер" AutoGenerateColumns="false" - в CssClass="менеджера mgrid" EmptyDataText="записи не существует..." DataKeyNames="ACLId" ShowFooter="истинный" HorizontalAlign="центр" ширина="100%" AllowPaging="true" в EnableSortingAndPagingCallback="истинный" pagesize для="500" AllowSorting="правда" видна="ложных" onpageindexchanging="gvACLReport_PageIndexChanging" EnableSortingAndPagingCallbacks="правда"и GT;
<AlternatingRowStyle CssClass="mgridalt" />
<PagerSettings PageButtonCount="10000" />
<PagerStyle CssClass="gridview" HorizontalAlign="Center">
<колонки>
<asp:templatefield>
<headertemplate>
&ЛТ;АСП:чекбокс с ID="chkAllACLReport" атрибут runat="сервер" autopostback элемента управления="истинный" OnCheckedChanged="OnCheckedChanged" /&ГТ;
<itemtemplate>
&ЛТ;АСП:чекбокс с ID="chkACLReport" атрибут runat="сервер" autopostback элемента управления="истинный" OnCheckedChanged="OnCheckedChanged"/&ГТ;
<ItemStyle Width="20px" />
<asp:TemplateField HeaderText="ACL Id">
<itemtemplate>
&ЛТ;АСП:метка идентификатор="lblACLId" атрибут runat="сервер" текст=в'<%# Ивала("ACLId") %&ГТ; в'>
<ItemStyle Width="20px" />
<asp:TemplateField HeaderText="путь доступа">
<itemtemplate>
&ЛТ;АСП:текстовое поле с ID="lblAccessPathACL" атрибут runat="сервер" строк="3" ширина="400 пикселей" текст=в'<%# Ивала("AccessPath") %&ГТ;'только для чтения="истинный" текстовую="многострочный" для свойства borderstyle="нет" BorderWidth="0px" фона="прозрачный"и GT;
<ItemStyle Width="150px" />
<asp:TemplateField HeaderText="имя каталога">
<itemtemplate>
&ЛТ;АСП:текстовое поле с ID="lblDirectoryName" атрибут runat="сервер" строк="3" ширина="400 пикселей" текст=в'<%# Ивала("каталог название") %&ГТ;'только для чтения="истинный" текстовую="многострочный" для свойства borderstyle="нет" BorderWidth="0px" фона="прозрачный"и GT;
<ItemStyle Width="150px" />
<asp:TemplateField HeaderText="группа пользователей">
<itemtemplate>
&ЛТ;АСП:метка идентификатор="lblUserGroup" атрибут runat="сервер" текст=в'<%# Ивала("Асэргрупп") %&ГТ; в'>
<ItemStyle Width="150px" />
<HeaderStyle CssClass="mgridheader" />
<RowStyle CssClass="mgriditem" />
//Пожалуйста, проверьте это таблица содержит выпадающий список для обновления статуса и кнопку Отправить и очистить
Статус: | &ЛТ;как ASP:dropdownlist с ИД="ddlChangeStatus" autopostback элемента управления="истинный" AppendDataBoundItems="истинный" атрибут runat="сервер" ширина="200 пикселей" свойстве datasourceid="SDSChangeStatus" DataTextField="статус" DataValueField="StatusId"> <asp:ListItem Text="--Select--" Value="0"> &ЛТ;как ASP:sqldatasource его идентификатор="SDSChangeStatus" атрибут runat="сервер" параметр connectionString="&ЛТ;%$ connectionstrings в:gtsgeneralconn %&ГТ;" SelectCommand="VT_getStatusList" SelectCommandType="StoredProcedure"> <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="ddlChangeStatus" Дисплей="динамической" сообщение об ошибке="выбрать статус" InitialValue="0" SetFocusOnError="правда"и GT;* |
&ЛТ;АСП:кнопка ID="btnChangeStatus" атрибут runat="сервер" текст="отправить" CausesValidation="ложных" onclick="btnChangeStatus_Click" /> <asp:Button ID="btnChangeClear" runat="server" Text="Clear" CausesValidation="False" onclick="btnChangeClear_Click" /> |
с фоновым кодом:
охраняемых недействительными ChangeStatusGlobalSensitiveNonSensitivereport()
{
int rowsAffected = 0;
foreach (строка GridViewRow в gvGlobalSensitive.Rows)
{
если (строки.RowType == DataControlRowType.Строкаданных)
{
bool значение этот флажок установлен = ряд.Ячейки[0].Элементы Управления.OfType<CheckBox().FirstOrDefault().Проверен;
если (не этот флажок установлен)
{
using (SqlConnection con = new SqlConnection(cs))
{
cmd = new SqlCommand("VT_ACLReportChangeStatus", con);
УМК.Свойство Commandtype = Система.Данных.Командный тип.Хранимая процедура;
УМК.CommandTimeout = 3600;
cmd.параметры.AddWithValue("@ChangeStatus", ddlChangeStatus.SelectedItem.Text.Метод toString());
cmd.параметры.AddWithValue("@ACLId", строка.Клетки[1].Управления.Метод oftype().Метода firstordefault().Текст);
против.Открыть();
УМК.Метод executenonquery();
против.Закрывать();
rowsAffected++;
}
}
}
lblUpdatedRowsMsg.Text = rowsAffected + " строки обновлены!!";
lblUpdateMsg.Text = "Деталь Успешно Сохранена!!";
gvGlobalSensitive.Видна = ложь;
tableChangeStatus.Видна = ложь;
divReport.Видна = ложь;
}
if (rowsAffected == 0)
{
lblUpdateMsg.Текст = "пожалуйста, установите флажок, чтобы обновить статус!!";
lblUpdatedRowsMsg.Text = rowsAffected + " строки обновлены!!";
}
}
// Пожалуйста, проверьте хранимую процедуру:
Изменить процедуру [dbo].[VT_ACLReportChangeStatus]
(
@ChangeStatus nvarchar(50)=null,
@ACLId int
)
АС
// Exec VT_ACLReportChangeStatus 'Complete',34
НАЧАТЬ
UPDATE VT_ACLReport SET Status = @ChangeStatus WHERE ACLId = @ACLId
Конец
F-ES Sitecore
Это всегда будет медленно. Используйте подкачку, чтобы обеспечить одновременное отображение пользователю только 10 или 20 записей. Если вам нужно обновить много записей одновременно, то предоставьте какой-нибудь другой метод для этого, а не показывать все данные в gridview.