ASP.NET DropDownList问题:SelectedItem没有更改

时间:2010-09-28 04:47:26

标签: asp.net drop-down-menu

我正在填充DropDownList控件,如下所示 -

public partial class UserControls_PMS_Send2DeliveryTeam : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            // SA 100928 Get the delivery teams and their respective email addresses
            string[] delTeam = ConfigurationManager
                               .AppSettings["deliveryTeamNames"]
                               .Split(',');
            string[] delTeamEmails = ConfigurationManager
                                     .AppSettings["deliveryTeamEmails"]
                                     .Split('|');

            if (delTeam.Length != delTeamEmails.Length)
            {
                showAlert("You have an error in the configuration of the delivery teams");
                return;
            }

            for(int looper=0; looper<delTeam.Length; looper++)
                delTeamDDList
                .Items
                .Add
                ( 
                    new ListItem(delTeam[looper], delTeamEmails[looper])
                );

        }

    // Other methods
}

但是,只要用户从此下拉列表中选择一个值,就只会选择第一个项目。为了澄清更多内容,假设该列表包含4个项目item 1item 2item 3item 4。当用户从列表中选择第4项时,它会选择item 1作为所选值。

这背后的原因是什么?

修改

我刚刚使用firebug检查了DropDownList的生成HTML,看起来“selected”值根本没有改变,即使我从DropDownList中选择了不同的值。

生成的HTML如下 -

<select class="select" id="Send2DeliveryTeam_delTeamDDList" name="Send2DeliveryTeam$delTeamDDList">
    <option value="value1" selected="selected">Project Initiation Team</option>
    <option value="value2">Service Delivery Centre</option>
    <option value="value3">TCS</option>
    <option value="value4">PIT &amp; SDC</option>
    <option value="value5">SDC &amp; TCS</option>
    <option value="value6">PIT &amp; TCS</option>
    <option value="value7">PIT &amp; SDC &amp; TCS</option>
</select>

首先,用户从此下拉列表中选择一个值。然后他按下一个按钮,触发点击事件。按钮的相应事件处理函数是我访问下拉列表选定值的位置。代码如下 -

// Button event-handler code
protected void assignDelTeamButton_Click(object sender, EventArgs e)
{
    // This is where I am always getting the same value, no matther what I choose
    // from the dropdown list, and this value is the one which is selected by default
    // when the page loads. I mean, the "SelectedIndex" is always 0.
    string selected_value = delTeamDDList.SelectedItem.ToString();

    // Other  codes
}

ascx文件 -

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Send2DeliveryTeam.ascx.cs" Inherits="UserControls_PMS_Send2DeliveryTeam" %>
<div id="Common">
    <h3>Welcome <%string user = HttpContext.Current.Session["user_name"].ToString();%><%=user %></h3>
    <h1>Request Estimate Screen</h1>
    <span>Request Estimate and Assign a Delivery team to a Request</span><br />
    <label>Enter an existing project number</label>
    <asp:TextBox ID="reqNum" runat="server" CssClass="textBox" /><br />
    <label>Select Delivery Team</label>
    <asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" >

    </asp:DropDownList>
    <label> - Sorted in alpha order</label><br /><br />
    <label>&nbsp;</label>
    <asp:button ID="assignDelTeamButton" runat="server" Text="Continue" 
    CssClass="button" onclick="assignDelTeamButton_Click"/><br />
</div>

第二次修改

如果我按如下方式对ListItem进行硬编码,它可以完美地运行 -

<asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" >
    <asp:ListItem Text="Project Initiation Team" Value="email1@yahoo.com"></asp:ListItem> 
    <asp:ListItem Text="Service Delivery Centre" Value="email2@yahoo.com"></asp:ListItem>
    <asp:ListItem Text="TCS" Value="email3@yahoo.com"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC" Value="email4@yahoo.com"></asp:ListItem> 
    <asp:ListItem Text="SDC & TCS" Value="email5@yahoo.com"></asp:ListItem> 
    <asp:ListItem Text="PIT & TCS" Value="email6@yahoo.com"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC & TCS" Value="email7@yahoo.com"></asp:ListItem> 
</asp:DropDownList>

4 个答案:

答案 0 :(得分:8)

执行以下操作之一:

  1. 在Web.config中启用ViewState或在其中包含页面。
  2. 更好的是,确保ViewState仍然启用,但是在用户控件的Init中填充你的DDL(但不要用!IsPostBack包装它)。这将在每个页面/控件init上具有您的数据访问逻辑,即使在回发时,也不会向ViewState添加不必要的数据,因为您没有初始化DLL,然后让ViewState跟踪您对其数据所做的更改资源。但是,您仍然需要ViewState,因为ASP.NET中的DDL需要ViewState才能在回发时跟踪选定的索引/值(如果您完全关闭ViewState,则只能通过在发布的请求的FORM中找到它来获取返回选定值的DDL NameValueCollection中)。

答案 1 :(得分:7)

如果您在页面加载时执行此操作,请确保将其括在if( !IsPostBack ){...}

答案 2 :(得分:4)

如何将userControl添加到页面中?你是使用LoadControl("...Send2DeliveryTeam.ascx");技术动态做的吗?如果是这样,请确保在aspx页面Page_Init处理程序中调用LoadControl。任何后来的ViewState都将无法应用于控件中的ddl,选择将会丢失。

另外,请注意,如果在控件上设置Visible = false,则根本不会呈现它。你在哪个场合这样做?

答案 3 :(得分:2)

而不是使用SelectedItem尝试使用SelectedText。我在C#win-forms应用程序中遇到了同样的问题,虽然你会认为(至少我做过)SelectedText会在下拉列表中添加文本,但它实际上会选择带有该文本的项目。

希望这有帮助。