Multiple Select List

Discussion in 'ASP General' started by rn5a@rediffmail.com, Apr 27, 2007.

  1. Guest

    A Form has 2 select lists. The 1st one whose size is 5 (meaning 5
    options are shown at any given time) allows multiple selection whereas
    the 2nd one allows only 1 option to be selected at a time.

    When an option is selected in the 2nd select list, the ASP page posts
    itself. Assume that the 1st select list has the following 10 options
    (note that both the select lists are actually populated from 2
    different database tables):

    Australia
    Brazil
    Canada
    Denmark
    Egypt
    Finland
    Ghana
    Holland
    India
    Japan

    Suppose a user has selected Brazil, Finland & Holland in the 1st
    select list. Next the user selects an option in the 2nd select list.
    This causes the ASP page to post. Now after posting the page, I want
    the 1st select list to maintain its state so that Brazil, Finland &
    Holland remain selected (since the user had selected these 3 options
    in the 1st select list just before the page posted). This is how I
    tried it but it selects only the last option among the 3 options (i.e.
    after the page posts, only Holland remains selected):

    ===================================
    <%
    Dim arrLID,iEachLID,iLID,strLID,selFlag

    strLID=Request.Form("location")

    Dim objConn
    Set objConn=Server.CreateObject("ADODB.CONNECTION")
    'open the connection using ConnectionString

    Dim strSQL
    strSQL="SELECT * FROM Locations"

    Dim objRS
    Set objRS=Server.CreateObject("ADODB.RECORDSET")
    objRS.Open strSQL,objConn
    %>
    <select name="location" multiple size=5>
    <%
    Do Until(objRS.EOF)
    If Not(IsEmpty(strLID)) Then
    arrLID=Split(strLID,", ")
    For Each iEachLID In arrLID
    iLID=iEachLID
    If(CInt(iLID)=CInt(objRS("LID"))) Then
    selFlag=" selected"
    Else
    selFlag=""
    End If
    Next
    Else
    selFlag=""
    End If
    %>
    <option value="<%= objRS("LID") %>"<%= selFlag %>><%=
    objRS("Location") %></option>
    <%
    objRS.MoveNext
    Loop
    %>
    </select>
    ===================================

    Can someone please point out what am I missing in the above code?
     
    , Apr 27, 2007
    #1
    1. Advertising

  2. wrote:
    > A Form has 2 select lists. The 1st one whose size is 5 (meaning 5
    > options are shown at any given time) allows multiple selection whereas
    > the 2nd one allows only 1 option to be selected at a time.
    >
    > When an option is selected in the 2nd select list, the ASP page posts
    > itself. Assume that the 1st select list has the following 10 options
    > (note that both the select lists are actually populated from 2
    > different database tables):
    >
    > Australia
    > Brazil
    > Canada
    > Denmark
    > Egypt
    > Finland
    > Ghana
    > Holland
    > India
    > Japan
    >
    > Suppose a user has selected Brazil, Finland & Holland in the 1st
    > select list. Next the user selects an option in the 2nd select list.
    > This causes the ASP page to post. Now after posting the page, I want
    > the 1st select list to maintain its state so that Brazil, Finland &
    > Holland remain selected (since the user had selected these 3 options
    > in the 1st select list just before the page posted). This is how I
    > tried it but it selects only the last option among the 3 options (i.e.
    > after the page posts, only Holland remains selected):
    >
    > ===================================
    > <%
    > Dim arrLID,iEachLID,iLID,strLID,selFlag
    >
    > strLID=Request.Form("location")
    >
    > Dim objConn
    > Set objConn=Server.CreateObject("ADODB.CONNECTION")
    > 'open the connection using ConnectionString
    >
    > Dim strSQL
    > strSQL="SELECT * FROM Locations"

    http://www.aspfaq.com/show.asp?id=2096
    >
    > Dim objRS
    > Set objRS=Server.CreateObject("ADODB.RECORDSET")
    > objRS.Open strSQL,objConn
    > %>
    > <select name="location" multiple size=5>
    > <%
    > Do Until(objRS.EOF)
    > If Not(IsEmpty(strLID)) Then
    > arrLID=Split(strLID,", ")
    > For Each iEachLID In arrLID
    > iLID=iEachLID
    > If(CInt(iLID)=CInt(objRS("LID"))) Then
    > selFlag=" selected"
    > Else
    > selFlag=""
    > End If
    > Next


    OK, the arrLID array contains Brazil, Finland and Holland. Walk through the
    code. The first recordset item I assume is Australia (despite the lack of an
    Order By clause on your query - you should not depend on the order of the
    results without an Order By clause). None of the array items match, so
    Australia remains unselected. Now Brazil gets tested. Brazil == Brazil, so
    selFlag is set to "selected". Ah! but the loop is not finished! It now
    compares Brazil to Finland, and, since they are not equal, it sets selFlag
    back to ""!

    The solution is simple, you need to break out of the For loop when a match
    is found. Do this by adding Exit For immediately after setting selFlag to
    "selected"

    You may want to consider a more efficient solution:

    Dim arrLID,iEachLID,iLID,strLID,selFlag
    Dim arData, i, sLocation

    strLID=Request.Form("location")

    'Split this string ONCE, outside of the loop
    If Not(IsEmpty(strLID)) Then
    arrLID=Split(strLID,", ")
    End IF

    strSQL="SELECT LID,Location FROM Locations Order By LID"
    Set objRS= objConn.Execute(strSQL,,1) '1=adCmdText
    If Not objRS.EOF then arData = objRS.GetRows
    objRS.Close:Set objRS=Nothing
    'if you are done with the connection, close and destroy
    'it here as well

    if IsArray(arData) then
    for i = 0 to ubound(arData,2)
    iLID = CInt(arData(0,i)) 'if LID is int in the db Cint is not
    needed
    sLocation = arData(1,i)
    selFlag = ""
    if isArray(arrLID) then
    for each iEachLID in arLID
    if CInt(iEachLID) = iLID then
    selFlag="selected"
    exit for
    end if
    next 'iEachLID
    end if
    %>
    <option value="<%= iLID%>"<%= selFlag %>><%=
    sLocation%></option>

    <%
    next 'i
    end if

    --
    Microsoft MVP - ASP/ASP.NET
    Please reply to the newsgroup. This email account is my spam trap so I
    don't check it very often. If you must reply off-line, then remove the
    "NO SPAM"
     
    Bob Barrows [MVP], Apr 27, 2007
    #2
    1. Advertising

  3. Guest

    On Apr 26, 7:18 pm, "Bob Barrows [MVP]" <>
    wrote:
    > wrote:
    > > A Form has 2 select lists. The 1st one whose size is 5 (meaning 5
    > > options are shown at any given time) allows multiple selection whereas
    > > the 2nd one allows only 1 option to be selected at a time.

    >
    > > When an option is selected in the 2nd select list, the ASP page posts
    > > itself. Assume that the 1st select list has the following 10 options
    > > (note that both the select lists are actually populated from 2
    > > different database tables):

    >
    > > Australia
    > > Brazil
    > > Canada
    > > Denmark
    > > Egypt
    > > Finland
    > > Ghana
    > > Holland
    > > India
    > > Japan

    >
    > > Suppose a user has selected Brazil, Finland & Holland in the 1st
    > > select list. Next the user selects an option in the 2nd select list.
    > > This causes the ASP page to post. Now after posting the page, I want
    > > the 1st select list to maintain its state so that Brazil, Finland &
    > > Holland remain selected (since the user had selected these 3 options
    > > in the 1st select list just before the page posted). This is how I
    > > tried it but it selects only the last option among the 3 options (i.e.
    > > after the page posts, only Holland remains selected):

    >
    > > ===================================
    > > <%
    > > Dim arrLID,iEachLID,iLID,strLID,selFlag

    >
    > > strLID=Request.Form("location")

    >
    > > Dim objConn
    > > Set objConn=Server.CreateObject("ADODB.CONNECTION")
    > > 'open the connection using ConnectionString

    >
    > > Dim strSQL
    > > strSQL="SELECT * FROM Locations"

    >
    > http://www.aspfaq.com/show.asp?id=2096
    >
    >
    >
    >
    >
    >
    >
    > > Dim objRS
    > > Set objRS=Server.CreateObject("ADODB.RECORDSET")
    > > objRS.Open strSQL,objConn
    > > %>
    > > <select name="location" multiple size=5>
    > > <%
    > > Do Until(objRS.EOF)
    > > If Not(IsEmpty(strLID)) Then
    > > arrLID=Split(strLID,", ")
    > > For Each iEachLID In arrLID
    > > iLID=iEachLID
    > > If(CInt(iLID)=CInt(objRS("LID"))) Then
    > > selFlag=" selected"
    > > Else
    > > selFlag=""
    > > End If
    > > Next

    >
    > OK, the arrLID array contains Brazil, Finland and Holland. Walk through the
    > code. The first recordset item I assume is Australia (despite the lack of an
    > Order By clause on your query - you should not depend on the order of the
    > results without an Order By clause). None of the array items match, so
    > Australia remains unselected. Now Brazil gets tested. Brazil == Brazil, so
    > selFlag is set to "selected". Ah! but the loop is not finished! It now
    > compares Brazil to Finland, and, since they are not equal, it sets selFlag
    > back to ""!
    >
    > The solution is simple, you need to break out of the For loop when a match
    > is found. Do this by adding Exit For immediately after setting selFlag to
    > "selected"
    >
    > You may want to consider a more efficient solution:
    >
    > Dim arrLID,iEachLID,iLID,strLID,selFlag
    > Dim arData, i, sLocation
    >
    > strLID=Request.Form("location")
    >
    > 'Split this string ONCE, outside of the loop
    > If Not(IsEmpty(strLID)) Then
    > arrLID=Split(strLID,", ")
    > End IF
    >
    > strSQL="SELECT LID,Location FROM Locations Order By LID"
    > Set objRS= objConn.Execute(strSQL,,1) '1=adCmdText
    > If Not objRS.EOF then arData = objRS.GetRows
    > objRS.Close:Set objRS=Nothing
    > 'if you are done with the connection, close and destroy
    > 'it here as well
    >
    > if IsArray(arData) then
    > for i = 0 to ubound(arData,2)
    > iLID = CInt(arData(0,i)) 'if LID is int in the db Cint is not
    > needed
    > sLocation = arData(1,i)
    > selFlag = ""
    > if isArray(arrLID) then
    > for each iEachLID in arLID
    > if CInt(iEachLID) = iLID then
    > selFlag="selected"
    > exit for
    > end if
    > next 'iEachLID
    > end if
    > %>
    > <option value="<%= iLID%>"<%= selFlag %>><%=
    > sLocation%></option>
    >
    > <%
    > next 'i
    > end if
    >
    > --
    > Microsoft MVP - ASP/ASP.NET
    > Please reply to the newsgroup. This email account is my spam trap so I
    > don't check it very often. If you must reply off-line, then remove the
    > "NO SPAM"- Hide quoted text -
    >
    > - Show quoted text -- Hide quoted text -
    >
    > - Show quoted text -


    Bob, it was indeed very very kind of you to show a more efficient way
    to do the same thing. Thanks a lot.

    Regards,

    RON
     
    , Apr 27, 2007
    #3
  4. Guest

    On Apr 26, 7:40 pm, wrote:
    > On Apr 26, 7:18 pm, "Bob Barrows [MVP]" <>
    > wrote:
    >
    >
    >
    >
    >
    > > wrote:
    > > > A Form has 2 select lists. The 1st one whose size is 5 (meaning 5
    > > > options are shown at any given time) allows multiple selection whereas
    > > > the 2nd one allows only 1 option to be selected at a time.

    >
    > > > When an option is selected in the 2nd select list, the ASP page posts
    > > > itself. Assume that the 1st select list has the following 10 options
    > > > (note that both the select lists are actually populated from 2
    > > > different database tables):

    >
    > > > Australia
    > > > Brazil
    > > > Canada
    > > > Denmark
    > > > Egypt
    > > > Finland
    > > > Ghana
    > > > Holland
    > > > India
    > > > Japan

    >
    > > > Suppose a user has selected Brazil, Finland & Holland in the 1st
    > > > select list. Next the user selects an option in the 2nd select list.
    > > > This causes the ASP page to post. Now after posting the page, I want
    > > > the 1st select list to maintain its state so that Brazil, Finland &
    > > > Holland remain selected (since the user had selected these 3 options
    > > > in the 1st select list just before the page posted). This is how I
    > > > tried it but it selects only the last option among the 3 options (i.e.
    > > > after the page posts, only Holland remains selected):

    >
    > > > ===================================
    > > > <%
    > > > Dim arrLID,iEachLID,iLID,strLID,selFlag

    >
    > > > strLID=Request.Form("location")

    >
    > > > Dim objConn
    > > > Set objConn=Server.CreateObject("ADODB.CONNECTION")
    > > > 'open the connection using ConnectionString

    >
    > > > Dim strSQL
    > > > strSQL="SELECT * FROM Locations"

    >
    > >http://www.aspfaq.com/show.asp?id=2096

    >
    > > > Dim objRS
    > > > Set objRS=Server.CreateObject("ADODB.RECORDSET")
    > > > objRS.Open strSQL,objConn
    > > > %>
    > > > <select name="location" multiple size=5>
    > > > <%
    > > > Do Until(objRS.EOF)
    > > > If Not(IsEmpty(strLID)) Then
    > > > arrLID=Split(strLID,", ")
    > > > For Each iEachLID In arrLID
    > > > iLID=iEachLID
    > > > If(CInt(iLID)=CInt(objRS("LID"))) Then
    > > > selFlag=" selected"
    > > > Else
    > > > selFlag=""
    > > > End If
    > > > Next

    >
    > > OK, the arrLID array contains Brazil, Finland and Holland. Walk through the
    > > code. The first recordset item I assume is Australia (despite the lack of an
    > > Order By clause on your query - you should not depend on the order of the
    > > results without an Order By clause). None of the array items match, so
    > > Australia remains unselected. Now Brazil gets tested. Brazil == Brazil, so
    > > selFlag is set to "selected". Ah! but the loop is not finished! It now
    > > compares Brazil to Finland, and, since they are not equal, it sets selFlag
    > > back to ""!

    >
    > > The solution is simple, you need to break out of the For loop when a match
    > > is found. Do this by adding Exit For immediately after setting selFlag to
    > > "selected"

    >
    > > You may want to consider a more efficient solution:

    >
    > > Dim arrLID,iEachLID,iLID,strLID,selFlag
    > > Dim arData, i, sLocation

    >
    > > strLID=Request.Form("location")

    >
    > > 'Split this string ONCE, outside of the loop
    > > If Not(IsEmpty(strLID)) Then
    > > arrLID=Split(strLID,", ")
    > > End IF

    >
    > > strSQL="SELECT LID,Location FROM Locations Order By LID"
    > > Set objRS= objConn.Execute(strSQL,,1) '1=adCmdText
    > > If Not objRS.EOF then arData = objRS.GetRows
    > > objRS.Close:Set objRS=Nothing
    > > 'if you are done with the connection, close and destroy
    > > 'it here as well

    >
    > > if IsArray(arData) then
    > > for i = 0 to ubound(arData,2)
    > > iLID = CInt(arData(0,i)) 'if LID is int in the db Cint is not
    > > needed
    > > sLocation = arData(1,i)
    > > selFlag = ""
    > > if isArray(arrLID) then
    > > for each iEachLID in arLID
    > > if CInt(iEachLID) = iLID then
    > > selFlag="selected"
    > > exit for
    > > end if
    > > next 'iEachLID
    > > end if
    > > %>
    > > <option value="<%= iLID%>"<%= selFlag %>><%=
    > > sLocation%></option>

    >
    > > <%
    > > next 'i
    > > end if

    >
    > > --
    > > Microsoft MVP - ASP/ASP.NET
    > > Please reply to the newsgroup. This email account is my spam trap so I
    > > don't check it very often. If you must reply off-line, then remove the
    > > "NO SPAM"- Hide quoted text -

    >
    > > - Show quoted text -- Hide quoted text -

    >
    > > - Show quoted text -

    >
    > Bob, it was indeed very very kind of you to show a more efficient way
    > to do the same thing. Thanks a lot.
    >
    > Regards,
    >
    > RON- Hide quoted text -
    >
    > - Show quoted text -


    Bob, I encountered a new problem with the 1st select list.

    Suppose Brazil, Finland & Holland are selected in the 1st select list.
    Next I select an option from the 2nd select list; the page posts & the
    1st select list shows Brazil, Finland & Holland selected.

    After this, I again select a different option in the 2nd select list;
    again the page gets posted but surprisingly, the options selected in
    the 1st select list i.e. Brazil, Finland & Holland no longer remain
    selected. In fact, when I click the submit button, the action page
    just retrieves an empty string i.e. Request.Form("location") is just
    an empty string instead of the location ids (objRS("LID")) of the 3
    locations!

    Why is the 1st select list losing its state under such circumstances?

    Please note that when an option is selected in the 2nd selected list,
    the page posts to itself (which I have done using JavaScript) but when
    the submit button is clicked, the page posts to another page.
     
    , Apr 27, 2007
    #4
  5. wrote:
    <snip - please snip irrelevant text>
    > Bob, I encountered a new problem with the 1st select list.
    >
    > Suppose Brazil, Finland & Holland are selected in the 1st select list.
    > Next I select an option from the 2nd select list; the page posts & the
    > 1st select list shows Brazil, Finland & Holland selected.
    >
    > After this, I again select a different option in the 2nd select list;
    > again the page gets posted but surprisingly, the options selected in
    > the 1st select list i.e. Brazil, Finland & Holland no longer remain
    > selected. In fact, when I click the submit button, the action page
    > just retrieves an empty string i.e. Request.Form("location") is just
    > an empty string instead of the location ids (objRS("LID")) of the 3
    > locations!
    >
    > Why is the 1st select list losing its state under such circumstances?
    >
    > Please note that when an option is selected in the 2nd selected list,
    > the page posts to itself (which I have done using JavaScript) but when
    > the submit button is clicked, the page posts to another page.


    It's got to have something to do with the way the form is getting submitted.
    Help us out by posting a small repro. Create a new pair of test pages that
    contain nothing but the code needed to reproduce this problem and post them
    here. We need to run your code in order to test it, and we do not have your
    database, so hardcode the option list in the second select element and
    substitute an ad hoc recordset for the recordset actually used in your
    actual code to populate the first select element:

    Dim objRS
    const adInteger=3
    const adVarChar = 200
    Set objRS = createobject("adodb.recordset")
    With objRS.Fields
    .Append "LID",adInteger
    .Append "Location",adVarChar,100
    End With
    objRS.Open
    With objRS
    .AddNew Array("LID","Location"), Array(1,"Australia")
    .AddNew Array("LID","Location"), Array(2,"Brazil")
    'etc.
    End With


    The second test page will likely contain only this code:
    <%
    Response.Write "Request.Form(""location"") contains """ & _
    Request.Form("location")

    --
    Microsoft MVP - ASP/ASP.NET
    Please reply to the newsgroup. This email account is my spam trap so I
    don't check it very often. If you must reply off-line, then remove the
    "NO SPAM"
     
    Bob Barrows [MVP], Apr 27, 2007
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Pranjal Jain
    Replies:
    3
    Views:
    183
    saras
    Apr 10, 2008
  2. Dan Thomas
    Replies:
    0
    Views:
    296
    Dan Thomas
    Feb 2, 2011
  3. palmiere
    Replies:
    1
    Views:
    466
    Erwin Moller
    Feb 9, 2004
  4. Ferd Berfel
    Replies:
    4
    Views:
    169
  5. Max
    Replies:
    5
    Views:
    263
    Thomas 'PointedEars' Lahn
    Apr 14, 2008
Loading...

Share This Page