Привязка DropDownList к ListItemCollection и значение, не добавляемое в DDL - PullRequest
6 голосов
/ 29 января 2010

У меня есть этот код в бизнес-классе.

    internal ListItemCollection GetAllAgents()
    {
        DataTable table = dao.GetAllAgents();
        ListItemCollection list = new ListItemCollection();

        foreach (DataRow row in table.Rows)
        {
            list.Add(new ListItem(row["agent_name"].ToString(), row["id"].ToString()));
        }
        return list;
    }

Я возвращаю стол из дао без проблем. Я смотрю, как свойства текста и значений заполняются правильно (+1 для какой-то удивительной неграмотности?) И возвращаюсь к презентации, и я связываюсь вот так

 Helper helper = new Helper();
 ListItemCollection agentList = helper.GetAllAgents();
 agentList.Insert(0,"");
 this.ddlAgent.DataSource = agentList;
 this.ddlAgent.DataBind();

когда получаю полученное значение

this.ddlAgent.SelectedValue

Я ожидаю увидеть идентификатор агента, но получаю текст (имя агента), поэтому я попробовал это

this.ddlAgent.SelectedItem.Value

но я получил те же результаты. Затем я взглянул на генерируемый источник HTML, и он выглядит так

<select name="ctl00$ContentPlaceHolder1$ddlAgent" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$ddlAgent\',\'\')', 0)" id="ctl00_ContentPlaceHolder1_ddlAgent">
        <option selected="selected" value=""></option>
        <option value="agent1_name">agent1_name</option>
        <option value="agent2_name">agent2_name</option>

этот шаблон продолжается для всех агентов. Я надеюсь, что просто делаю что-то с головой, и вы все можете посмеяться, решая мою проблему:)

Спасибо, ребята.

РЕДАКТИРОВАТЬ: если я сделаю это так

ListItemCollection agentList = helper.GetAllAgents();
agentList.Insert(0,"");
foreach (ListItem agent in agentList)
{
    this.ddlAgent.Items.Add(agent);
}

работает нормально.

Ответы [ 2 ]

17 голосов
/ 29 января 2010

Попробуйте сделать:

this.ddlAgent.DataTextField = "Text";
this.ddlAgent.DataValueField = "Value";
this.ddlAgent.DataSource = agentList;
this.ddlAgent.DataBind();

Должно также работать, и это, вероятно, лучше, чем перебирать список без причины.

Обновление Найдено другое (короче)способ сделать это:

this.ddlAgent.Items.AddRange(agentList.ToArray());
this.ddlAgent.DataBind();

Используя Items.AddRange() вместо установки источника с DataSource, ASP может выяснить, что он должен использовать свойства Text и Value.

6 голосов
/ 04 марта 2013

Если agentList является коллекцией ListItemCollection, у меня работает следующий код без вызова this.ddlAgent.DataBind ();

this.ddlAgent.Items.AddRange( agentList.Cast<ListItem>().ToArray() ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...