views:

194

answers:

4

Hi, I am populating a DropDownList control as follows -

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
}

But whenever user selects a value from this dropdown, only the first item is being selected. To clarify more, suppose that the list has 4 items, item 1, item 2, item 3 and item 4. When user selects 4th item from the lists, it selects item 1 as the selected value.

What's the reason behind this?

EDIT

I have just checked the generated HTML for the DropDownList using firebug, and it seems the "selected" value doesn't change at all even if I choose different values from the DropDownList.

The generated HTML is as follows -

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

First, user selects a value from this dropdown list. Then he presses a button, which fires the click event. The button's corresponding event-handler function is the place where I am accessing the dropdownlist's selected value. The code is as follows -

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

The ascx file -

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

Second Edit

If I hard-code the ListItems as follows, it works perfectly -

<asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" >
    <asp:ListItem Text="Project Initiation Team" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="Service Delivery Centre" Value="[email protected]"></asp:ListItem>
    <asp:ListItem Text="TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="SDC & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC & TCS" Value="[email protected]"></asp:ListItem> 
</asp:DropDownList>
+6  A: 

if you are doing this on page load make sure that you enclose it in if( !IsPostBack ){...}

Vinay B R
Yeah, I have done that. Still not working.
Night Shade
@Night Shade. Clarify what you are doing here, do you have a "Submit" button on the page, or do you have AutoPostBack=true on your DDL. And when you say "only first one is selected", what do you mean - from the codebehind after submitting the form, or on the client-side. Because as i said in my comment, the HTML in View Source/inspect element will NOT get updated when you make a selection, as this is a client-side event (the HTML cannot see this), only when you submit the form will you see the selected value (or with JS debugging)
RPM1984
@RPM: I think it should be clear enough now.
Night Shade
+4  A: 

How is the userControl being added to the page? Are you doing it dynamically using the LoadControl("...Send2DeliveryTeam.ascx"); technique? If so, make sure you call LoadControl in your aspx page Page_Init handler. Any later and the ViewState will fail to be applied to the ddl in the control and the selection will be lost.

Also, be aware that if you set Visible = false on the control, it will not be rendered at all. In which event are you doing this?

Daniel Dyson
The user control is already in that page. I am just making it visible/invisible.
Night Shade
Where is your logic for making it visible/invisible? on the .aspx or .ascx? In what event do you change visibility?
TheGeekYouNeed
+6  A: 

Do one of the following:

  1. Turn on ViewState in Web.config or containing page if it's off there.
  2. Better yet, make sure ViewState is still enabled, but populate your DDL in your User Control's Init (but don't wrap it with !IsPostBack). This will have your data access logic on every page/control init, even on postback, but it won't add unnecessary data to ViewState as you're not init'ing your DLL, then having ViewState track the changes you make to it's data source. However, you still want ViewState because DDLs in ASP.NET require ViewState in order to track the selected index/value on postback (if you completely turn off ViewState you can only get the DDLs posted back selected value by finding it in the posted Request's FORM NameValueCollection).
Ted
+2  A: 

Instead of using SelectedItem try using SelectedText. I have encounter the same problem in a C# win-forms application and although you would think (at least I did) that SelectedText would add text to the drop-down it actually selects the item with that text.

Hope this helps.

Gage