Почему эта привязка данных DropDownList к списку <String>не работает? - PullRequest
3 голосов
/ 22 октября 2010

Я пытаюсь связать List<String> с DropDownList в пользовательском элементе управления.Я думаю Я поступаю правильно, но кажется, что после выполнения моего кода привязки очищаются .Вот код для обзора!

Пользовательский контроль:

<asp:DropDownList ID="subjectNameDropDown" runat="server"/>
<asp:DropDownList ID="yearLevelDropDown" runat="server"/>

Автоматически сгенерированный разработанный код:

public partial class NewSiteMetadataUserControl {
    protected global::System.Web.UI.WebControls.DropDownList subjectNameDropDown;
    protected global::System.Web.UI.WebControls.DropDownList yearLevelDropDown;
}

Кодовый код:

public partial class NewSiteMetadataUserControl : UserControl
{
    protected override void CreateChildControls()
    {
        subjectNameDropDown = new DropDownList();
        yearLevelDropDown = new DropDownList();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        EnsureChildControls();

        // Attempt 1
        List<String> subjectNames = GetSubjectValues();
        foreach (var subjectName in subjectNames)
            subjectNameDropDown.Items.Add(subjectName);
        subjectNameDropDown.DataBind();

        // Attempt 2
        List<String> yearLevels = GetYearLevelValues();
        yearLevelDropDown.DataSource = yearLevels;
        yearLevelDropDown.DataBind();
    }
}

Должен ли этот подход работать?

Если это так, как отладитьчто происходит после выполнения кода?

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Да, этот подход должен работать, вот почему в настоящее время это не так,

  • DropDownList, созданный с DataBind, нуждается в DataSource.Вот почему Попытка № 1 не работает.
  • Если вы привязываетесь к List<string>, нет четкой пары ключ / значение для привязки.Вот почему при привязке к List<Person> (например) необходимо переопределить .ToString() в классе Person, чтобы обеспечить привязку ключ / значение, или вручную установить DataTextField, DataValueField.
  • У ASP.NET нет способа определить пару ключ / значение для string.

Подумайте о , какой HTML вы хотите.Каким должен быть ключ / значение для простой строки?Не имеет смысла, делает это.

Так как вы действительно не заботитесь о «ключе» (только о том, что отображается), я предлагаю вам вместо этого связать с Dictionary<TKey,TValue>.

Либо сделайте так, чтобы ваш метод возвращал это, либо выполните итерацию по списку и добавьте их в словарь с индексом.

0 голосов
/ 25 октября 2010

Проблема здесь была CreateChildControls.Где-то в моих попытках сделать эту работу я добавил этот метод, который инициализирует элементы управления.Это не является необходимым и фактически привело к стиранию привязок данных, так как это автоматически вызывалось платформой после OnLoad.

. Решением было удалить этот метод и вызвать EnsureChildControls.

...