Я пытаюсь сделать пользовательское управление сервером, которое наследовалось DropDownList. Я даю контроль, вход XML, содержащий некоторые пары ключ/значение и мое управление, показывает их DropDownList. Я делаю элементы списка в Методе рендеринга переопределения как это:
foreach (XElement child in root.Elements("Choice"))
{
string title = child.Element("Title").Value;
string score = child.Element("Score").Value;
item = new ListItem();
item.Text = title;
item.Value = score;
this.Items.Add(item);
}
Проблема состоит в том, что, когда пользователь выбирает и объект в списке и сообщениях страницы назад, выбранный пункт потерян, и список повторно инициализируется с данными по умолчанию.
У кого-либо есть какая-либо идея, как сохранить выбранный пункт, т.е. поддержать состояние?
Вот полный источник:
public class MultipleChoiceQuestionView2 : DropDownList
{общедоступный MultipleChoiceQuestionView2 (): основа () {}
защищенное переопределение пустой Рендеринг (устройство записи HtmlTextWriter) {устройство записи. RenderBeginTag (HtmlTextWriterTag. Таблица); устройство записи. RenderBeginTag (HtmlTextWriterTag. TR);
устройство записи. RenderBeginTag (HtmlTextWriterTag. Td); Синтаксический анализ #region Contets, если (! Строка. IsNullOrEmpty (это. Содержание)) {XElement базируются = XElement. Синтаксический анализ (это. Содержание);
если (корень. HasAttributes) {это. NoOfChoices = Int32. Синтаксический анализ (корень. Атрибут ("ItemCount").Value);}
это. Объекты. Ясный (); это. Стиль. Добавьте ("ширина", "100 пкс"); это. Стиль. Добавьте ("семейство шрифтов", "Tahoma"); это. Объекты. Ясный (); объект ListItem = новый ListItem (); объект. Текст =""; объект. Значение = "0"; это. Объекты. Добавьте (объект);
foreach (ребенок XElement в корне. Элементы ("Выбор")) {представляют заголовок в виде строки = ребенок. Элемент ("Заголовок").Value; представьте счет в виде строки = ребенок. Элемент ("Счет").Value; объект = новый ListItem (); объект. Текст = заголовок; объект. Значение = счет;
this.Items.Add(item);
}} #endregion основа. Рендеринг (устройство записи); устройство записи. RenderEndTag ();
если (это. Требуемый) {RequiredFieldValidator rfv = новый RequiredFieldValidator (); rfv. ControlToValidate = это. Идентификатор; rfv. InitialValue = "0"; rfv. Текст = "*"; если (! Строка. IsNullOrEmpty (это. ValidationGroup)) {rfv. ValidationGroup = это. ValidationGroup;} устройство записи. RenderBeginTag (HtmlTextWriterTag. Td); rfv. RenderControl (устройство записи); устройство записи. RenderEndTag ();}
устройство записи. RenderEndTag (); устройство записи. RenderEndTag ();} #region общественность Свойств представляют Содержание в виде строки {добираются {возвращают ViewState ["Содержание"] == пустой указатель? "": ViewState ["Содержание"].ToString ();} набор {ViewState ["Содержание"] = значение; }}
частный интервал mNoOfChoices; общедоступные международные NoOfChoices {добираются {возвращают mNoOfChoices;} набор {mNoOfChoices = значение; }}
частная строка mValidationGroup; общедоступная строка, которую ValidationGroup {получают {возвращает mValidationGroup;} набор {mValidationGroup = значение; }}
общедоступная строка SelectedChoice {получает {возврат""; }}
частный bool mRequired = ложь; общественность bool Необходимый {добирается {возвращают mRequired;} набор {mRequired = значение; }}
#endregion}
Заранее спасибо.
У вас есть два варианта: ViewState или ControlState .
Разницу в ViewState можно преодолеть, установив EnableViewState = "false"
в директиве страницы, в то время как ControlState не может.
По сути, вам нужно подключиться к пакету состояний , когда вы получаете / устанавливаете значения раскрывающегося списка.
Здесь есть достойный пример , где настраиваемый элемент управления является производным от класса Button и поддерживает состояние между запросами страницы - должен хорошо соответствовать вашему сценарию.
Надеюсь, с этого вы начнете.