Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Состояние контролов (viewstate и т.п.) / 14 сообщений из 14, страница 1 из 1
22.05.2006, 12:31
    #33742281
Dmitry Gurianov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Всем привет! Подскажите, пожалуйста, по вопросу...

На форме имеется статический DropDownList с данными из БД. В зависимости от выбора пользователя ниже должны динамически создаваться другие DropDownList-ы. При этом в них пользователь тоже что-то может выбирать, и состояние также должно сохраняться.
Поскольку чтение ViewState происходит после Init, то динамические контроллы в Init я создавать не могу, т.к. на тот момент неизвестно, что выбрал юзер в статическом DropDownList. С другой стороны, в Load я могу создавать все эти контроллы, но к тому моменту чтение ViewState я яже пропускаю, и что именно выбрал юзер в динамических - остается неизвестным :(
Наверное можно на какое-то событие формы или контроллов повесить передачу SelectedValue в переменную сессии, но на какое? Как правильно решить проблему?
Спасибо!
...
Рейтинг: 0 / 0
22.05.2006, 13:22
    #33742516
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
know-how как эта проблема решается.

1) На форме создаётся невидимый placeholder.

2) В OnInitialize создаются динамические dropdownlist'ы с ID, который был у них до отправки на сервер. Заетм помещаются в placeholder.

Пример:
Код: plaintext
1.
2.
3.
       DropDownList ddl = new DropDownList();
       ddl.ID = "ddl_1_1;
       phAnswers.Controls.Add(ddl);

3) В OnLoad нужно сохранять выбранные значения в hashtable, например.

Код: plaintext
1.
2.
3.
4.
      string controlId = "ddl_1_1";
      control ctlAnswer = phAnswers.FindControl(controlId);
      DropDownList ddl = (DropDownList)ctlAnswer;
      mValues.Add(controlId, ddl.SelectedValue.ToString());

Ну и там же воссоздавать эти контролы со значениями:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
GenerateDropDownListRow()
{
      DropDownList ddl = new DropDownList();
      string answ = string.Empty;
      if (mValues.ContainsKey(questionnaireFieldID))
            answ = mValues[questionnaireFieldID].ToString();

      if (answ.Length >  0 )
      {
            if (ddl.Items.Count >  0 )
            {
                  for (int i =  0 ; i < choices.Length; i++)
                  {
                        if (answ == choices[i])
                        {
                              ddl.SelectedIndex = i +  1 ; break;
                        }
                  }
            }		
      }
}

Только осталось отличать моменты где сохранять значения, а где генерировать контролы и получать значения.
...
Рейтинг: 0 / 0
22.05.2006, 14:21
    #33742698
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
авторНаверное можно на какое-то событие формы или контроллов повесить передачу SelectedValue в переменную сессии, но на какое? Как правильно решить проблему?

я бы делал так... не надо сохранять значение - сохраняй весь контрол целиком ;)
...
Рейтинг: 0 / 0
22.05.2006, 14:55
    #33742788
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
А если контрол не 1, а 101? Не тяжело будет таскать в request контрол целиком, вместо значения?
...
Рейтинг: 0 / 0
22.05.2006, 16:07
    #33743006
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
авторА если контрол не 1, а 101? Не тяжело будет таскать в request контрол целиком, вместо значения?
не очень понятно куда его нужно таскать - сессия она на сервере и тоскать её никуда не надо... а если viewstate на 1000000 значений, а если у бабушки ... то она будет дедушкой ;) я же сказал - я бы делал так ;)
...
Рейтинг: 0 / 0
22.05.2006, 16:23
    #33743083
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Что то перечитал... Опять получился пост довольно резковатый ;) Извиняюсь за стиль!
P.S. кстати, не тяжело будет серверу пересоздавать объекты по новой при каждом постбэке, а также держать в памяти hashtable со значениями ;) ?
...
Рейтинг: 0 / 0
22.05.2006, 16:24
    #33743094
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Просто в моём примере всё контролы в placeholder получают значение контролов до постбэка автоматически через request.

Твой способ, думаю, прост и хорош для нескольких (1 - 10) контролов, но для большего числа, думаю, тяжеловат будет. К тому же при сохранении довольно проблематично, на мой взгляд, проверять все значения сессии (если заведомо неизвестно количество контролов). Но это тоже моё личное мнение, почему я бы не стал использовать приведённый тобой способ. ;)
...
Рейтинг: 0 / 0
22.05.2006, 16:30
    #33743117
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
vladgrigP.S. кстати, не тяжело будет серверу пересоздавать объекты по новой при каждом постбэке, а также держать в памяти hashtable со значениями ;) ?
А как насчёт масштабируемости твоего способа?
...
Рейтинг: 0 / 0
22.05.2006, 16:35
    #33743139
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Я вовсе не хочу сказать, что твой способ плох, я просто не думал над использованием сессий для данной задачи. Я просто боюсь, что если одновременно будут работать около 1000 пользователй и заполнять форму с в среднем 10 динамическими контролами, то web-серверу придётся не сладко.
Более того представим, что юзер заполняет поочередно несколько подобных старниц с разными контролами и может возваращаться на предыдущние страницы, при этом каждый раз нужно изменения созранять в БД. Или я не прав?
...
Рейтинг: 0 / 0
22.05.2006, 17:58
    #33743476
Dmitry Gurianov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
ух ты, понаписали! :)
Вечером проверю, спасибо за советы! Ну чесслово, мозг сломал...
...
Рейтинг: 0 / 0
22.05.2006, 18:22
    #33743536
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
ИМХО придёт profil и расставит точки над i...

а, пока его нет:
авторЯ просто боюсь, что если одновременно будут работать около 1000 пользователй и заполнять форму с в среднем 10 динамическими контролами, то web-серверу придётся не сладко.

я тоже сижу и размышляю - какая разница между динамично созданным контролом и контролом, статично присутствующим на странице... разницы по нагрузке на сервер, пока не замечаю... я же не предлагаю статично расставить 100 контролов и в зависимости от ситуации показывать пользователю тот или иной ;) я предлагаю хранить необходимые (созданные контролы) в сессии... объясню почему я так думаю:
то что предлагаешь ты, повторяет весь стандартный процесс создания контрола, а передача его значения через hashtable - примерно, тот же viewstate. Вот я и думаю - какой смысл задействовать свой механизм (неизвестно верно ли сформированный), если существуют механизмы отработанные производителем - MS ;)
Так же давай задумаемся - если каждый последующий контрол заполняется запросом из БД - как такой вариант!? При моём раскладе - будет внесён контрол уже содержащий набор данных, а при твоём - будет очередной запрос к БД - как в таком случае с производительностью и нагрузкой на сервер?!
авторБолее того представим, что юзер заполняет поочередно несколько подобных старниц с разными контролами и может возваращаться на предыдущние страницы, при этом каждый раз нужно изменения созранять в БД.
вот вот... а так у нас уже существует определённый набор в сессии и наша задача просто подставить (вернуть) нужный контрол на своё место... и всё... а уж коль скоро нужны реальные изменения в БД - динамика так сказать ;) то и значения нужно просто добавлять к дропдаунам вот так MyDDL.Items.Add(new DDLItem), а не перезапрашивать БД на наличие новых значений...
P.S. немного напутано написал, наверное - но идея ясна, надеюсь ;)
P.P.S. to Dmitry Gurianov - вот два варианта (на выбор) - теперь сиди и думай... хе-хе...
авторКак правильно решить проблему?
...
Рейтинг: 0 / 0
22.05.2006, 19:06
    #33743650
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Без обид, я предпочту лишний запрос к БД хранению каждого из контролов в session. Объект session вообще не советую засорять подобным образом, а использовать для глобальных переменных или передачи параметров метода POST.

HashTable и ViewState - да, полагаю примерно равноценны в плане нагрузки.

И опять-таки - всё зависит от конкретной задачи. Думаю, задавшему этот вопрос человеку сейчас главное не оптимальный вариант, а чтобы оно просто заработало. Для простоты и большей понятности в этом случае вполне можно воспользоваться способом vladgrig'a.

PS. Я просто выступаю за то, что между Session и ViewState есть немалая разница - и то и другие надо страмиться сделать меньше. На помощь приходят БД и кэширование.
...
Рейтинг: 0 / 0
22.05.2006, 19:42
    #33743706
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
to Axeleron
приятно было поболтать... ;)
P.S. появилась новая пища для размышлений...
...
Рейтинг: 0 / 0
22.05.2006, 19:59
    #33743724
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Состояние контролов (viewstate и т.п.)
Взаимно :)
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Состояние контролов (viewstate и т.п.) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]