C# ниспадающий список выбранного элемента null, когда список строк / объектов, связанных с источником данных

Я пытаюсь привязать список строк к выпадающему. В веб-интерфейсе я могу правильно видеть список из раскрывающегося списка, но когда я выбираю значение и нажимаю на поиск, он выдает исключение нулевой ссылки, потому что кажется, что он доступен только для чтения. Вот что я попробовал:

<asp:DropDownList runat="server" ID="ddl"  AppendDataBoundItems="True">
<asp:ListItem Value="">Please Select</asp:ListItem></asp:DropDownList>

Код позади:

List<string> items = helper.GetData(); //A method that simply returns a list of strings.

ddl.DataSource = items;
ddl.DataBind();

protected void searchClick(object sender, EventArgs e){

/*This is null and when I inspect this, I don't see any value matching 
the string selected in dropdown.*/
var selectedOption = ddl.SelectedItem.Text;  
}

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

Спасибо.

3 ответа

У вас есть список привязок в выпадающем списке, но вы не можете добавить, какое значение нужно выбрать, когда выбрано любое значение.

If(!isPostBack())
{
ddl.DataSource = items;
ddl.DataTextField = "Field name which hold items(Text to be shown in ddl)";
ddl.DataValueField = "ID of items(Value for items)";
ddl.DataBind();
}

Если у вас есть только список, и вы должны добавить его в выпадающий список, используйте блоу-код.

List<string> items=helper.GetData();
for(var i=0; i < items.Count; i++)
{
    ddl.Items.Add(new ListItem(i, items[i]));
    //ddl.Items.Add(new ListItem(key, source)); For reference only
}

Чтобы получить значение вы можете использовать:

ddl.SelectedItem.Value;
ddl.SelectedItem.Text;

Посмотрев на это, я заметил две вещи:

  1. Если первые 4 строки находятся на вашей странице загрузки, убедитесь, что вы переносите их в

    if (! isPostBack) {

    }

Если он не обернут в! IsPostBack, то значение будет по умолчанию равным первому значению каждый раз, когда происходит обратная передача, так как ddl будет восстанавливаться каждый раз.

  1. Как упоминалось выше, вы не указываете DataTextField или DataValueField. Если они не указаны, вы получите типы объектов в выпадающем списке вместо значений.

Кроме того, рассмотрите возможность использования ddl.SelectedValue, а не SelectedItem.Text, поскольку это даст вам уникальный идентификатор, назначенный для DataValueField

 Dictionary<string, string> openWith = 
        new Dictionary<string, string>(); 

Вы должны использовать следующий список.

ddl.DataSource = items;
ddl.DataTextField = "Text Which Show In DropDown";
ddl.DataValueField = "value -When Text Is Select From Dropdown";
ddl.DataBind();
Другие вопросы по тегам