Повесть о двух DropDownLists (которые ведут себя по-разному, несмотря на то, что настроены одинаково) - PullRequest
0 голосов
/ 28 июня 2011

Хорошо, я собираюсь сойти с ума здесь, потому что обратное определение безумия делает то же самое и получает разные результаты.

Для данного ASPX:

<asp:DropDownList ID="ddl1" runat="server" DataSource="<%# DataContext.Items1 %>" 
DataValueField="Id" DataTextField="Text" AppendDataBoundItems="false"></asp:DropDownList>
<br/>
<asp:DropDownList ID="ddl2" runat="server" DataSource="<%# DataContext.Items2 %>" 
DataValueField="Key" DataTextField="Value" AppendDataBoundItems="false"></asp:DropDownList>

Можно подумать, что оба DropDownLists будут вести себя одинаково, то есть после обратной передачи оба будут проходить один и тот же жизненный цикл и работать нормально.В конце концов, единственное различие заключается в том, что они используют разные источники данных (оба IEnumerable ) и имеют доступ к различным свойствам полей Text / Value.

Поэтому я ожидаю, что при обратной передаче (посредством отправки формы),во время выполнения Page.LoadComplete оба DDL должны были загружаться: 1) загружать свои Элементы через DataSource и 2) загружать свое состояние (SelectedIndex) из данных обратной передачи.

К сожалению, это не так.Я вижу, что ddl1 будет выполнять LoadViewState (загружает элементы), а затем LoadPostData (устанавливает SelectedIndex), но ddl2 не выполняет LoadViewState - только LoadPostData.В этот момент ddl2 теперь неверен, поскольку, если у него нет Items, он игнорирует значение из LoadPostData.

Так что я ошеломлен.Я очистил решение и перезапустил VS2010 несколько раз, я добавил EnableViewState = "true" в ddl2, и все же противоречивое поведение сохраняется.

Может кто-нибудь пролить свет на то, почему DropDownLists ведут себя по-разному, несмотря на то, что настроены почти одинаково?

УТОЧНЕНИЕ

Моя страница значительно сложнеечем 2 DropDownLists, я только указал 2 в примере для ясности.Там на самом деле 42 DDL, 7 флажков, 5 текстовых полей и 2 списка

ОБНОВЛЕНИЕ

Я пыталсяA) обмен источниками данных / полями - без различийБ) использование одних и тех же источников данных / полей - без различийВ) Удаление ddl1 - ddl2 снова начал работать! D) Добавлен ddl3 (копия ddl1) - ни ddl2, ни ddl3 не сработали

Так что я думаю, что я бьюсь здесь о каком-то ограничении размера ViewState здесь - я собираюсь перекодировать некоторые из моих DropDownLists так, чтобы они не сохраняли Элементы в ViewState, а вместо этого перезагрузят его изисточник данных до LoadPostData.

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Самое простое объяснение, скорее всего, будет правильным. Таким образом, если все одинаково за исключением источника данных, то проблема заключается в источнике данных. Кроме того, он работает с одним, поэтому проблема заключается в том, чтобы иметь два. Вы пробовали:

  1. загрузка двух выпадающих списков с использованием одного и того же источника данных (как хорошего, так и плохого?)
  2. загрузка единственного выпадающего списка на странице, указывающей на неверный источник данных?

Надеюсь, это поможет.

0 голосов
/ 29 июня 2011

Я не знаю точно, в чем проблема, но я предполагаю, что у меня было 1 слишком много полей формы, из-за чего ddl2 не сохранялся правильно во ViewState.

Итак, я создал LightDropDownList, который подклассифицировал DropDownList и использовал его для ddl2.LightDropDownList отключает ViewState и вызывает DataBind () во время OnInit.Обычный DDL работает так, что он загружает Предметы из ViewState, устанавливает выбранный элемент в LoadPostData, а затем Предметы переопределяются при привязке данных Страницы.Таким образом, я мог бы избавить от необходимости хранить все данные Предметов в ViewState, просто вызвав DataBind вручную.Таким образом, когда вызывается метод LoadPostData, в DDL загружаются элементы и, следовательно, выбранный элемент установлен правильно.

0 голосов
/ 28 июня 2011

Похоже на ответ теоретического @, еще одна вещь, чтобы проверить / попробовать:

Убедитесь, что «Ключ» и «Значение» определены как свойства в DataContext.Items2. Убедитесь, что они не являются открытыми полями данных, но на самом деле являются свойствами; некоторые элементы управления .NET (я думаю, повторители) выглядят явно и только для свойств при выполнении отражения.

Возможно, временно переключите параметры ddl2 DataValueField и DataTextField на те же, что и ddl1, чтобы помочь сузить возможные проблемы.

Вам интересно, какова причина этой проблемы - удачи!

...