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

6

我正在按照以下方式填充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,似乎即使我从DropDownList选择不同的值,"selected"值也没有改变。
生成的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>

第二次编辑

如果我将ListItems硬编码如下,它可以完美地工作 -

<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>

@Night Shade - 你能提供原始的 HTML 吗?在进入“selected item”之前,我想看看实际的 HTML 是什么样子。让我们看看它是否是有效的 html。我觉得不行。 - RPM1984
顺便说一句 - Firebug 不会在原始 HTML 中显示所选的值 - 您需要使用 JavaScript 进行测试:$(“yourddl option:selected”).text(); - RPM1984
你的代码对我来说运行良好。你想发布你的网页代码(标签)用于“DropDownList”吗? - Manish
@Night Shade:关于用户控件-> 不,那不是问题。 - Manish
1
只是一个猜测 - 页面上启用了Viewstate吗?我在DDL上没有看到它(这意味着默认情况下启用,除非在更高级别关闭)。确保页面级别上启用ViewState,然后在DDL上加上EnableViewState="true"。 - RPM1984
显示剩余6条评论
4个回答

8

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


@Night Shade。请澄清你在这里做什么,页面上是否有“提交”按钮,或者你的DDL上是否有AutoPostBack=true。当你说“只选择第一个”的时候,你是指在提交表单后的代码后台还是客户端。因为正如我在评论中所说,当你进行选择时,View Source/检查元素中的HTML不会被更新,因为这是一个客户端事件(HTML看不到),只有当你提交表单时才会看到选定的值(或使用JS调试)。 - RPM1984

8

请执行以下操作之一:

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

4
用户控件是如何添加到页面的?您是否使用动态方式使用 LoadControl(“…Send2DeliveryTeam.ascx”); 技术进行操作?如果是这样,请确保在aspx页面Page_Init处理程序中调用LoadControl。稍后,ViewState将无法应用于控件中的ddl,并且选择将丢失。
此外,请注意,如果在控件上设置Visible = false,则根本不会呈现该控件。您在哪个事件中执行此操作?

用户控件已经在该页面中。我只是将其设置为可见/不可见。 - MD Sayem Ahmed
你在哪里编写控件可见性的逻辑代码?是在 .aspx 还是 .ascx 文件中?你在哪个事件中改变控件的可见性? - TheGeekYouNeed

2

与其使用SelectedItem,请尝试使用SelectedText。 我在C#窗体应用程序中遇到了同样的问题,尽管你会认为(至少我是这样认为的),SelectedText会将文本添加到下拉菜单中,但实际上它会选择具有该文本的项目。

希望这可以帮助到您。


很有趣,但是你的回答点亮了我的灯泡。现在我们已经过去七年了,我仍然需要vb.net。我试图设置.SelectedIndex = 8,因为上面的下拉列表框让我这样做了。然而,SelectedIndex是一个位置,不是一个值。所以我把代码改成了设置.SelectedValue = 8,它有效了。我的好ddl有0-8的索引,但我的问题ddl只有0-7的索引。谢谢。 - JustJohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接