下拉列表未返回正确的值

时间:2014-09-04 16:22:54

标签: c# asp.net

我正在尝试检索以前数据绑定的DropDownList上的值,如下所示:

<asp:DropDownList ID="DropDownListReception" runat="server" CssClass="span3 drop-down-reception"
            OnPreRender="DropDownListReception_PreRender" OnSelectedIndexChanged="DropDownListReception_SelectedIndexChanged" AutoPostBack="true"></asp:DropDownList>

protected void Page_Load(object sender, EventArgs e)
    {
        var receptions = BLLFactory.ReceptionBLL.GetListAll();
        DropDownListReception.DataSource = receptions;
        DropDownListReception.DataBind();
    }

在DropDown PreRender上,我正在个性化这个DropDown:

protected void DropDownListReception_PreRender(object sender, EventArgs e)
    {
        if (DropDownListReception.DataSource != null)
        {
            DropDownListReception.Items.Clear();
            DropDownListReception.Items.Add(new ListItem("-- Select --", "NA"));
            foreach (Reception item in (DropDownListReception.DataSource as IEnumerable))
            {
                DropDownListReception.Items.Add(new ListItem(item.Name + " " + item.Number, item.Id.ToString()));
            }
        }
    }

这是完美的,我的DropDown加载它应该,我的问题是当我尝试在SelectedIndexChanged事件中检索SelectedValue时,它不会将值作为字符串返回但作为一种类型,我正在做的是:< / p>

protected void DropDownListReception_SelectedIndexChanged(object sender, EventArgs e)
    {
        //CurrentReception is a string i want to save in ViewState
        //I also tried (sender as DropDownList).SelectedValue
        //Tried DropDownListReception.SelectedValue
        CurrentReception = DropDownListReception.SelectedItem.Value;
    }

但是这个“DropDownListReception.SelectedItem.Value”将始终返回“Reception”,它是项目的类型,而不是我在PreRender事件中指定为id值的id。如果我这样做也会发生这种情况:“DropDownListReception.SelectedItem.Text”,这也会返回“接收”。如何返回分配给DropDown项的字符串值?

4 个答案:

答案 0 :(得分:0)

var CurrentReception = DropDownListReception.SelectedItem as Reception;
string val = CurrentReception.PropertyYouNeed;

答案 1 :(得分:0)

DropDownListReception.SelectedItem.Text和DropDownListReception.SelectedItem.Value将返回选择的值,这是将ListItem添加到列表时使用的ListItem中的第二个术语。换句话说,问题在于item.Id.ToString()。它返回对象的类型而不是ID。我不确定你的物品实际上是由什么构成的,所以我不确定你真正需要什么,但你确定它不仅仅是item.Id? ToString()通常是对象的字符串表示,如果item.Id是一个int,那么ToString应该给你相当于该int的字符串...但是它不起作用的事实表明item.Id实际上并不是一个int。

答案 2 :(得分:0)

我想通了,我在PageLoad上的DataBinding DropDownList,它在SelectedIndexChanged事件之前触发。由于DropDown在其值发生变化时执行PostBack,因此PageLoad是&#34;正在重新创建&#34;在获取SelectedIndexChanged代码之前,DropDown和i正在丢失更改。

谢谢大家的答案。:)

答案 3 :(得分:0)

我认为您需要将列表项强制转换为您存储在其中的类型(接收),然后从您想要的Reception对象访问该属性(从您的描述中听起来就像您想要id)。像这样:

protected void DropDownListReception_SelectedIndexChanged(object sender, EventArgs e)
{
    //CurrentReception is a string i want to save in ViewState
    CurentReception = ((Reception)DropDownListReception.SelectedItem).Id.ToString();
}