Вопрос .NET (web) DataGrid with AllowCustomPaging

User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Вопрос .NET (web) DataGrid with AllowCustomPaging

Post by Dmitry67 »

Извините, я в WEB.UI совсем не специалист, с код C# лезу только чтобы править SQL запросы, а в UI не силегн
Но специалисты тут тоже не знают что делать

Дело в том что при перемещении по страницам Page_Load вызывается два раза, что приводит к запросу к SQL серверу дважды, и, надо сказать, довольно дорогостоящему запросу

Когда то я это нашел и недолго думая (и не особо разбираясь) вставил в Page_Load
if (!IsPostBack) ЗапросДанных;

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

Что нибуль посоветуете ?
Спасибо
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
chico97
Уже с Приветом
Posts: 159
Joined: 04 Jul 2002 12:39
Location: Moscow

Re: Вопрос .NET (web) DataGrid with AllowCustomPaging

Post by chico97 »

Dmitry67 wrote:Извините, я в WEB.UI совсем не специалист, с код C# лезу только чтобы править SQL запросы, а в UI не силегн
Но специалисты тут тоже не знают что делать

Дело в том что при перемещении по страницам Page_Load вызывается два раза, что приводит к запросу к SQL серверу дважды, и, надо сказать, довольно дорогостоящему запросу

Когда то я это нашел и недолго думая (и не особо разбираясь) вставил в Page_Load
if (!IsPostBack) ЗапросДанных;

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

Что нибуль посоветуете ?
Спасибо


Дима,
это вы серьезно про то что они про IsPostBack не знали? :roll: :roll: :roll: как они вообще работают?
а проблема у них дизайне. если актуальность данных после первой выборки не важна, то и за чем второй раз в базу лезть? совет один: переработать дизайн.
Упорство и Труд Все Перетрут
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Ну да, вставил это я туда сам, по наитию :)
А что именно должно быть переработано в дизайне ?

Дело в том, что если вставить как было у меня то возникает проблема
Есть список документов 3,2,1
Кликаешь на 2, открывается его редактирование
Тем временем вставляешь 4 документ
Возвращаешься из редактирвоания в список документов
Видишь 4,3,2,1
Все правильно
Но кликаешь на 4 (первая строчка), а открывается 3 (тот который там раньше стоял). Хрен его знает... Могу кусок кода дать...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
chico97
Уже с Приветом
Posts: 159
Joined: 04 Jul 2002 12:39
Location: Moscow

Post by chico97 »

Dmitry67 wrote:Ну да, вставил это я туда сам, по наитию :)
А что именно должно быть переработано в дизайне ?

Дело в том, что если вставить как было у меня то возникает проблема
Есть список документов 3,2,1
Кликаешь на 2, открывается его редактирование
Тем временем вставляешь 4 документ
Возвращаешься из редактирвоания в список документов
Видишь 4,3,2,1
Все правильно
Но кликаешь на 4 (первая строчка), а открывается 3 (тот который там раньше стоял). Хрен его знает... Могу кусок кода дать...


непонятно почему так отрабатывает :pain1: . ведь при перерисовке контрола (который оттображает список докоментов) идет запрос в базу на обновление списка и прописываются правильные ссылки на документы. может быть на клиенте скрипт отображает новый номер, а айди документа в базе оставляет старым?
запости код, посмотрим :wink:
Упорство и Труд Все Перетрут
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Вырезал что не по делу
CDC - это сами документы
в Page_Load было if (!IsPostBack) GridDataBind();
Загрузка нужной страницы находится в GetDataView
Когда открывается не тот Cdc, то в OpenCdc передается неверное число из LinkButtonCDC_click, почему, не могу понять
Заранее спасибо если что найдете свежим взглядом

Code: Select all

  пока убрал
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Готов более точно сформулировать вопрос

Если стоит if (&IsPostBack) DataBind() то все работает нормально за одним исключением
Когда возвращаешься на эту страницу из другой, то НА ЭКРАНЕ все абсолютно нормально
Но при клике на документ передается не тот номер
Номер формируется так:

Code: Select all

<asp:LinkButton CssClass="lien_noir" id="LinkButtonCDC" runat="server" onclick="LinkButtonCDC_click" CommandArgument='<%#DataBinder.Eval(Container.DataItem,"IDCDC")%>' ToolTip='<%#DataBinder.Eval(Container.DataItem,"CDCREF")%>'>
               <%#PAST.Business.CommonLib.InsertWordBreakV2(DataBinder.Eval(Container.DataItem,"CDCNAME"), 15)%>
            </asp:LinkButton>


Я не могу понять как так может быть на жкране нормально а где то внутри нет
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Еще раз другими словами
Из списка документов уходу в просмотр одного документа
За это время список документов в базе меняется
Нажимаю кнопку возврата в список

Вызываются Page_Init, Page_Load(IsPostBack=0, честно вызывается SQL), Page_PreRender.
В итоге на экране - новый список, все OK !

Дальше у дного элемента ставлю CheckBox. Отрабатывается

Page_Init, Page_Load(IsPostBack=1), Page_PreRender.
И магия ! на экране возник старый список ! Где блин он хранится ?????
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

Post by Seryi »

Дима почитаите про ViewState - узнаете где оно хранится и как вообше ето все работает в .НЕТ. Сеичас точно все сам не помню, поетому тяжело подсказать.
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Post by Komissar »

Seryi!
Long time, no see. Переехал в Голландию? Или на неметчину подался? Расскажи, интересно.
User avatar
Komissar
Уже с Приветом
Posts: 64875
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Post by Komissar »

Сорри, тока щас разглядел, что Вы в Зверюге. Сине-желтый -- красивое сочетание, да? :mrgreen:
How come? Вроде бы Зверюга не стояла в планах?
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

"Огласите весь список, пожалуйста!" (C)
Неплохо бы привести листинги aspx и aspx.cs файлов. Пока что вижу некоторые странности в приведенном куске aspx'а:
обработчик повешен на event Click, но при этом задан CommandArgument для event Command.
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:Еще раз другими словами
Из списка документов уходу в просмотр одного документа
За это время список документов в базе меняется
Нажимаю кнопку возврата в список

Вызываются Page_Init, Page_Load(IsPostBack=0, честно вызывается SQL), Page_PreRender.
В итоге на экране - новый список, все OK !

Дальше у дного элемента ставлю CheckBox. Отрабатывается

Page_Init, Page_Load(IsPostBack=1), Page_PreRender.
И магия ! на экране возник старый список ! Где блин он хранится ?????


Проблема скорее всего в том, что откуда-то происходит замещение данных в State. Может там в коде что-то в Session хранят или даже в Cash? А по поводу двойной отработки Initialize и Page_Load - это да. Первая стадия считывание, вторая отработка хендлов событий, типа вашего button_click.

На самом деле заполнение датасета, если вы его испльзуете, лучше всего выносить в другую функцию класса вашего пейджа, а сам вызов контролировать постбэком и как вариант самим фактом заполнения той переменной/массива/иного объекта который вы используете на форме.

Кстати, как именно вы получаете инфу в DataGrid? Через DataReader/DataSet/CustomFunction? Просто интересно. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Vitaliy wrote:Кстати, как именно вы получаете инфу в DataGrid? Через DataReader/DataSet/CustomFunction? Просто интересно. :)


Спасибо
Буду смотреть

Заполняется через DataAdapter.Fill
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:
Vitaliy wrote:Кстати, как именно вы получаете инфу в DataGrid? Через DataReader/DataSet/CustomFunction? Просто интересно. :)


Спасибо
Буду смотреть

Заполняется через DataAdapter.Fill


Т.е. все таки через датасет. А сама строка с DA.Fill(DS) где стоит? Кстати, если ее ставить с проверкой на постбэк, что как я понял вы и сделали, то естественно что будет отрабатывать только один раз, до - следующего входа в этот класс(SomeApp.SomePage) без сохранения стейта. Но, вот чего я не могу понять, так это того как может быть откат датасета? Может вы таки не проапдейтили в базу тот датаадаптер через который вы залили ту таблицу, в которой произошли изменения, и соответственно, перезашли на этот же класс без сохраниения стейта (изпостбэк == ложь)???
Конечно, может я невнимательно что то прочитал, бывает со мной такое иногда + болею сейчас, поправьте меня - если это так.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Vitaliy wrote:1 А сама строка с DA.Fill(DS) где стоит?

2 Кстати, если ее ставить с проверкой на постбэк, что как я понял вы и сделали, то естественно что будет отрабатывать только один раз, до - следующего входа в этот класс(SomeApp.SomePage) без сохранения стейта.

3 Но, вот чего я не могу понять, так это того как может быть откат датасета?

4 Может вы таки не проапдейтили в базу тот датаадаптер через который вы залили ту таблицу, в которой произошли изменения, и соответственно, перезашли на этот же класс без сохраниения стейта (изпостбэк == ложь)???
Конечно, может я невнимательно что то прочитал, бывает со мной такое иногда + болею сейчас, поправьте меня - если это так.


1 Page_Load
2 так оно и сделано
3 Я тоже :)
4 Он точно проапдейтился... Все это очень странно

Интересно что есть еще 4 списка с точно такой же структурой и логикой работы
В них все работает как часы !
Буду рыть дальше
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Есть прогресс
Если закомжентировать в конце Page_PreRender эту фигню то все работает
Что эта хренотень делает ?

Code: Select all

string strScript = "<SCRIPT Language=\"JAVASCRIPT\">\n";
  strScript += "var cdcIntelligentButtons=" +
  ((bool)_visite.UserManager.GetPreferences ("IntelligentButtons")).ToString().ToLower()
  + ";\n";
  strScript += "strMsgUnseul = 'Vous devez sélectionner UN ET UN SEUL Cdc';\n";
  strScript += "strAccentAigu = 'é';\n";
  strScript += "LocalLoadForm(" + _nbChecksSelected + ");\n";
  strScript += "</SCRIPT>\n";
  Page.RegisterStartupScript ("CdcNavigationStartupScript", strScript);

Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:Есть прогресс
Если закомжентировать в конце Page_PreRender эту фигню то все работает
Что эта хренотень делает ?



Грубо говоря, при формировании документа формы, ДО этапа создания контролов и стейта, ты можешь писать в в HTML рендерер любую хрень что тебе захочется. Скрипты DHTML или DOM как раз через него и пихают. Откровенно говоря, за более чем год использования .Net, я PreRender ни разу не использовал, как то все и так замечательно и беспроблемно решалось, зато отошел очень далеко от проблемы реализации разными брендами JavaScript/JScript.

Нижы ссылки на то - что почитать.

http://msdn.microsoft.com/library/defau ... Stages.asp
Общее описание сценария исполнения и формарования Веб Форм.

http://support.microsoft.com/default.as ... -us;305141
весьма хорошее определение дано для Page_PreRender, а так же суть исполнения Формы и использования IsPostBack.

http://www.google.com/custom?cof=LW%3A4 ... _PreRender
Тут вообще кладезь народная.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Спасибо
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:Спасибо


Наздоровье, обращайся если то. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Рыл, рыл. ВОт что нашлось
На самом деле JAVASCRIPT не виноват
Похоже виновато вот ето
И вообще нормально так в файл все время фигачить Ь

Code: Select all

protected override object LoadPageStateFromPersistenceMedium() 
  {
  string m_viewState;
  LosFormatter m_formatter;
  object viewStateBag=null;

  string file = GetFileName();
  StreamReader sr = new StreamReader(file);
  m_viewState = sr.ReadToEnd();
  sr.Close();
  m_formatter = new LosFormatter();
  try
  {
    viewStateBag = m_formatter.Deserialize(m_viewState);
  }
  catch 
  {
  PASTLog.Write("navigation.aspx (line 626) : The View State is invalid or corrupted", null, PAST.Business.LogLevel.Fatal);
  }

  return viewStateBag;
}

protected override void SavePageStateToPersistenceMedium(object viewStateBag)
  {
  string file = GetFileName();
  StreamWriter sw = new StreamWriter(file);
  LosFormatter m_formatter = new LosFormatter();
  m_formatter.Serialize(sw, viewStateBag);         
  sw.Close();
  return;
}

Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Вопрос, а зачем в файле хранить? Не лучше уж тогда в SQL сервере? Тем более что вы на нем сидите, как я понял, а так же возможность сохранять стейт в MS SQL практически прозрачно и напрямую.

Кстати, LosFormatter - это ваш кастом форматтер?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Vitaliy wrote:Вопрос, а зачем в файле хранить? Не лучше уж тогда в SQL сервере? Тем более что вы на нем сидите, как я понял, а так же возможность сохранять стейт в MS SQL практически прозрачно и напрямую.

Кстати, LosFormatter - это ваш кастом форматтер?


LosFormatter
"This type supports the .NET Framework infrastructure and is not intended to be used directly from your code."

Это становится все интереснее :)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Дык... велик и могуч Framework. А уж методов реализации для конкретных задач. :)
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Посмотрел я этот LosFormatter, честно говоря мое недопонимание стало еще больше. Почему вы его используете, а не связку BinaryWriter/BinaryReader + BinaryFormatter, если уж так охото писать в файлы, вместо более удобной сериализации в сиквел?

В общем если это возможно (не раскрывается комм. тайна) я бы был очень польщен, услышав ответы на мой вопросы. :roll:
Last edited by Vitaliy on 01 Sep 2003 20:45, edited 1 time in total.
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

А уж про то что результат полученный от BinaryFormatter просто в разы меньше, про это я думаю даже не надо говорить. :)

Return to “Вопросы и новости IT”