MitchCZ Ответов: 1

Как сохранить данные динамически добавляемых gridviews между постбэками?


Привет,

Я уже прочитал все статьи о сохранении данных динамических элементов управления, но не могу найти правильный вариант для своей проблемы.

Я пытаюсь импортировать файлы excel с переменным количеством файлов на страницу APSX. Я решил отображать файлы excel через gridviews и постоянно сохранять их в списке<gridview> (для последующей обработки).

Но я не могу понять проблему с обратным вызовом, соответственно, чтобы сохранить список<gridview>, Когда происходит событие OnClick.
Я пробовал Page_PreInit, ViewState, ... Но я не знаю, как это сделать..

Пожалуйста, неужели никто не знает, как это решить?

Большое спасибо.
Янв

Что я уже пробовал:

ASPX page:
<pre><asp:Panel ID="pnl_grids" runat="server"></asp:Panel>
<asp:Button ID="bttn_CreateNewOrder" runat="server" Text="Test" OnClick="bttn_CreateNewOrder_Click" />


код поддержки:
private List<GridView> gvObjList = new List<GridView>();
...
foreach (var file in dirParts.GetFiles())
            {
                gvCount++;
                string fileName = Path.GetFileName(file.FullName);
                string fileExtension = Path.GetExtension(file.FullName);

                //excel bind
                SparePartsOrderAHUMAN sp_AHUMAN = new SparePartsOrderAHUMAN(fileExtension, filesOrder.Order_PARTS_Path + "\\" + fileName);

                //create gridView
                GridView objGV = new GridView();
                objGV.ID = "gv_" + Path.GetFileNameWithoutExtension(file.FullName);                
                objGV.RowDataBound += new GridViewRowEventHandler(objGV_RowDataBound); //formating gridView
                objGV.DataSource = sp_AHUMAN.dtSparePart;
                objGV.DataBind();

                //CSS style
                objGV.Attributes.Add("class", "gv_SpareParts");
                objGV.AlternatingRowStyle.CssClass = "gv_SpareParts_AltrowStyle";
                objGV.HeaderStyle.CssClass = "gv_SpareParts_HeaderStyle";
                objGV.RowStyle.CssClass = "gv_SpareParts_Rowstyle";
.....
.....

//add to page and List, on the end
pnl_grids.Controls.Add(objGV);
gvObjList.Add(objGV);
}


protected void bttn_CreateNewOrder_Click(object sender, EventArgs e)
    {
        ..code after button click..
    
    }

1 Ответов

Рейтинг:
8

Richard Deeming

Когда вы делаете запрос на свою страницу, создается новый экземпляр класса страницы. Он обрабатывает запрос, отправляет ответ пользователю, а затем выбрасывается.

Любые значения, которые вы храните в поле внутри вашего класса, будут нет сохраняются между запросами.

У вас может возникнуть соблазн попытаться сохранить список в сеансе. Но это просто вызовет утечку памяти в вашем приложении - элементы управления не предназначены для сохранения за пределами одного запроса.

И с помощью static переменная тоже не сработает. Единый список будет использоваться совместно всеми запросами от всех пользователей вашего приложения. У вас были бы серьезные проблемы с безопасностью потоков. И у тебя все равно будет утечка памяти.

Вам нужно воссоздавать сетки каждый раз, когда ваша страница загружается. Вы могли бы потенциально использовать состояние представления[^] чтобы помочь, хотя это значительно увеличило бы размер отображаемой страницы и полезную нагрузку запроса.


MitchCZ

Спасибо, Ричард.
Похоже, что хорошего решения нет.

Я не знаю, является ли это четким программным решением, но я постараюсь создать один gridview на странице aspx для всех файлов excel, итеративно добавлять записи и разделять их пустой строкой в сетке. Если я правильно думаю..
Далее мне нужно выбрать несколько строк и сохранить их в таблице данных базы данных.

Кстати. Есть ли такая же проблема с ASP.NET MVC, где все создается динамически?

Richard Deeming

MVC не имеет понятия "элементы управления" и не использует состояние представления.

Кроме того, применяются те же комментарии - Вам нужно либо воссоздавать сетки каждый раз, когда вызывается действие, либо хранить данные где-то в памяти на сервере. Хранение данных в памяти, скорее всего, вызовет проблемы, особенно если у вас более двух пользователей.

И static переменные все еще существуют почти всегда неправильно в веб-приложении. :)

MitchCZ

Это правда, статические переменные-это путь в ад..(убежден :))

Итак, я должен сначала импортировать файлы excel в базу данных, а затем стандартно управлять данными с помощью gridviews на странице.
Однако по-прежнему существует проблема с переменным количеством файлов excel. Это зависит от ввода пользователя. Поэтому мне непонятно, как создать переменное количество просмотров сетки на одной странице, выбрать строки из всех сеток одновременно и продолжить, нажав на кнопку (сохранить выбранные строки в новой таблице данных и перейти на следующую страницу..) Похоже, что я должен сначала сохранить проверенные строки (true/false) в базе данных в виде специального столбца и только потом нажать кнопку..??

Richard Deeming

Похоже, что вы загружаете сетки из файлов Excel. Почему бы не хранить информацию, необходимую для идентификации файлов, загружаемых в сеансе, и использовать ее для перезагрузки файлов при каждой загрузке страницы? Эта информация должна быть значительно меньше, чем загруженные данные.