?
Solved

Problems with Dropdownlist and postback

Posted on 2006-06-12
12
Medium Priority
?
403 Views
Last Modified: 2012-06-22
I am populating a page with user controls dynamically. One of the control two dropdownlists. Once you make a selection in the first dropdown it populates the second. Here is the problem it only works on the second try. When you make a selection the first time it posts back, but no results are returned, if you try again, it works perfectly. I will post some code in the hopes that someone can help me find an answer.

as always I appreciate your help.
CJSantora

aspcx:

    <tr>
        <td align="left"><asp:Label ID="lblSearchManufacturers" runat="server" Text="Search By Manufacturer"></asp:Label></td>
        <td style="width: 81px" align="left"><asp:DropDownList ID="cboMakes" DataTextField="name" DataValueField="Makeid" runat="server" AutoPostBack=true Width="200px" OnSelectedIndexChanged="cboMakes_SelectedIndexChanged"></asp:DropDownList></td>
    </tr>
    <tr>
        <td align="left"><asp:Label ID="lblSearchByModel" runat="server" Text="Search By Model" Width="149px"></asp:Label></td>
        <td style="width: 81px" align="left"><asp:DropDownList ID="cboModels" DataTextField="name" DataValueField="modelid" runat="server" Width="200px"></asp:DropDownList></td>
    </tr>

code bhind:

public partial class includes__public_pubQuicktruckLocator : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Page.SetFocus(cboMakes);
        populateMakes(0);
    }

    protected void cboMakes_SelectedIndexChanged(object sender, EventArgs e)
    {  
        int intmakeid = 0;            
        intmakeid = Convert.ToInt32(cboMakes.SelectedItem.Value);

        Response.Write(intmakeid);
        Response.Write(sender.ToString() + "<br>");
        Response.End();

        populateMakes(intmakeid);
        populateModels(intmakeid);
    }


    private void populateMakes(int intmakeid)
    {        
        cboMakes.DataSource = data.GetUniqueTrucksFromAds();
        cboMakes.DataBind();
        cboMakes.Items.Insert(0,new ListItem("All Makes","0"));
        cboMakes.Items.FindByValue(intmakeid.ToString()).Selected = true;
    }

    private void populateModels(int intmakeid)
    {
        cboModels.DataSource = data.GetUniqueTruckModelsFromAds(intmakeid);
        cboModels.DataBind();
        cboModels.Items.Insert(0, new ListItem("All Models", "0"));
    }

    protected void cmdQuickSearch_Click(object sender, ImageClickEventArgs e)
    {
        int intmakeid = 0;
        int intmodelid = 0;

        if (Convert.ToInt32(e.X) != 0 && Convert.ToInt32(e.Y) != 0)
        {

            if (cboMakes.SelectedIndex != 0)
            {
                intmakeid = Convert.ToInt32(cboMakes.SelectedItem.Value);
            }
            if (cboModels.SelectedIndex != 0)
            {
                intmodelid = Convert.ToInt32(cboModels.SelectedItem.Value);
            }
            Response.Redirect("~/default.aspx?pg=results&make=" + intmakeid + "&model=" + intmodelid);
        }
    }

}
0
Comment
Question by:CJSantora
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
12 Comments
 
LVL 25

Expert Comment

by:dstanley9
ID: 16894530
in this case, you don't need to DataBind() the Makes on each call.  In fact, re-binding the data will cause you to lose your SelectedItem value. try:

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.SetFocus(cboMakes);
        if(!IsPostBack)
          populateMakes(0);
    }
0
 

Author Comment

by:CJSantora
ID: 16895567
I really appreciate your feedback dstanley9. I tried your suggestion, however the dropdownlist does not populate under this condition. The control is activated by a tabbed imagemap, so I think when you click on the tab to display the truck search it causes a postback and this is why there was no data bound to the control.


CJSantora
0
 
LVL 25

Expert Comment

by:dstanley9
ID: 16895592
Can you move the code:

          populateMakes(0);

to the event hadler fired when the tab is selected?
0
Understanding Linux Permissions

Linux for beginners: How to view the permissions associated with files and directories and also how you can change them.

 

Author Comment

by:CJSantora
ID: 16895799
I am not sure if that is a possibility or not, I will look into it. I have an additional question, and this may be a strech, but can you determine if the Postback was from a specific user control?

CJSantora
0
 
LVL 25

Expert Comment

by:dstanley9
ID: 16895835
I've never tried it myself, but you can try this method:

http://www.eggheadcafe.com/articles/20050609.asp
0
 

Author Comment

by:CJSantora
ID: 16896504
I thought I would post an additional finding that may offer some new ideas. The drowdownlist is using OnSelectedIndexChanged="cboMakes_SelectedIndexChanged to trigger the population of the next dropdownlist. I have determined that this is not happening on the first post, can anyone think of any reasons that the page would not see the OnSelectedIndexChanged="cboMakes_SelectedIndexChanged?

CJSantora
0
 
LVL 25

Expert Comment

by:dstanley9
ID: 16896597
IIRC, When you re-bind a control in Page_Load, it "clears" any events that would be triggered by the control (including SelectedIndexChanged).  That is one reason why you don't re-bind unless the request is not a post back.
0
 

Author Comment

by:CJSantora
ID: 16896685
I remmber you stating that in an earlier post and I continued trying to modify the code to eliminate that possibility. The code that is currently being executed does not do a second databind, but still does not return the proper id from the dropdownlist on the first post;

    protected void Page_Load(object sender, EventArgs e)
    {
        //Response.Write(cboMakes.Items.Count + "<br>");
        if (cboMakes.Items.Count == 0)
        {
            populateMakes();
        }
        else
        {
            populateModels();
        }

    }

    private void populateMakes()
    {        
        cboMakes.DataSource = data.GetUniqueTrucksFromAds();
        cboMakes.DataBind();
        cboMakes.Items.Insert(0, new ListItem("All Makes", "0"));
    }

    protected void cboMakes_SelectedIndexChanged(object sender, EventArgs e)  // NOT BEING CALLED AT ALL NOW
    {
        Response.Write("Index Changed");
        populateModels();
    }

    private void populateModels()
    {

        int intmakeid = 0;
        intmakeid = Convert.ToInt32(cboMakes.Selecteditem.Value);  // IS ALWAYS RETURNING ZERO ON FIRST PASS
        Response.Write(intmakeid);

        cboModels.DataSource = data.GetUniqueTruckModelsFromAds(intmakeid);
        cboModels.DataBind();
        cboModels.Items.Insert(0, new ListItem("All Models", "0"));
    }

    protected void cmdQuickSearch_Click(object sender, ImageClickEventArgs e)
    {
        int intmakeid = 0;
        int intmodelid = 0;

        if (Convert.ToInt32(e.X) != 0 && Convert.ToInt32(e.Y) != 0)
        {

            if (cboMakes.SelectedIndex != 0)
            {
                intmakeid = Convert.ToInt32(cboMakes.SelectedItem.Value);
            }
            if (cboModels.SelectedIndex != 0)
            {
                intmodelid = Convert.ToInt32(cboModels.SelectedItem.Value);
            }
            Response.Redirect("~/default.aspx?pg=results&make=" + intmakeid + "&model=" + intmodelid);
        }
    }

I really appreciate your help.
CJSantora
0
 
LVL 25

Accepted Solution

by:
dstanley9 earned 2000 total points
ID: 16896877
I think you may have PopulateModels() in the wrong spot:  try:

    protected void Page_Load(object sender, EventArgs e)
    {
        //Response.Write(cboMakes.Items.Count + "<br>");
        if (cboMakes.Items.Count == 0)
        {
            populateMakes();
        }
        else
        {
            //do not populate here as it will be populated when the make index changes
            //populateModels();
        }

    }
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The object model of .Net can be overwhelming at times – so overwhelming that quite trivial tasks often take hours of research. In this case, the task at hand was to populate the datagrid from SQL Server database in Visual Studio 2008 Windows applica…
Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Suggested Courses

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question