Siv
asked on
ASP.NET error "Cannot have multiple items selected in a DropDownList"
This is the error I am getting but only on the odd item?
Cannot have multiple items selected in a DropDownList.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: Cannot have multiple items selected in a DropDownList.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
<asp:ListView ID="lstSiteVisits" ViewStateMode="Enabled" runat="server" DataKeyNames="SiteVisitID" OnSelectedIndexChanging="l stSiteVisi ts_Selecte dIndexChan ging" OnSelectedIndexChanged="ls tSiteVisit s_Selected IndexChang ed" EnableViewState="true" EnablePersistedSelection=" true"& amp;gt;
Whilst trying to unravel what was causing this error I also tried using OnSelectedIndexChanging="l stSiteVisi ts_Selecte dIndexChan ging" at the moment there is a code behind for this but it has nothing in it so that entry could be removed.
In the "lstSiteVisits_SelectedInd exChanged" code I have this:
PopulateScreen looks like this:
The whole thing is working fine for nearly all the items in the list but if I page to the last page of records and select the first item at the top of the list I get the above crash.
Stepping through the code when I click the selected item, the call to "lstSiteVisits_SelectedInd exChanged" is made, the ID of the record I want to view is obtained from the SelectedDataKey.Value and the call to PopulateScreen is made, this runs through without any error, as soon as the first call is complete lstSiteVisits_SelectedInde xChanged is called again a second time (not sure why this occurs but would be interested to know why?) and again the PopulateScreen processes without any error. After that a call to the Page_PreRender occurs:
Because this is a PostBack call the PopulateSiteVisitList call is not made. Then the code moves to my "DataPagerSiteVisits_PreRe nder" code:
So in the instance where there is no search text entered the "PopulateSiteVisitsList" is called with the parameters as follows:
PopulateSiteVisitsList(-1, "Location", "") as there is no search text.
This is PopulateSiteVisitsList:
Can anyone point me to why this error is occurring and how to fix it. I have researched this error on the net and nothing I have found seems to make any difference?
Siv
Cannot have multiple items selected in a DropDownList.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: Cannot have multiple items selected in a DropDownList.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[HttpException (0x80004005): Cannot have multiple items selected in a DropDownList.]
System.Web.UI.WebControls.DropDownList.VerifyMultiSelect() +106
System.Web.UI.WebControls.ListControl.RenderContents(HtmlTextWriter writer) +9630133
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.WebControls.TableCell.RenderContents(HtmlTextWriter writer) +31
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +10
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.WebControls.Table.RenderContents(HtmlTextWriter writer) +211
System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +102
System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +32
System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +53
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) +40
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.Page.Render(HtmlTextWriter writer) +29
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1386
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34212
The page shows a Listview in the left side of the page with a select column and a data pager to scroll through the list of site visits (the application is used to record data about security officers in stores they are protecting and the supervisors who use this application can check if the officer is doing certain aspects of his/her job properly and whether their appearance and uniform is acceptable). When the user locates a record they want to view or amend they can click the select item in the list and this then updates the main right side of the page which has multiple drop down lists and text boxes which are populated from the SiteVisit table. The Listview has an "OnSelectedIndexChanged" parameter in the declaration i.e.:<asp:ListView ID="lstSiteVisits" ViewStateMode="Enabled" runat="server" DataKeyNames="SiteVisitID"
Whilst trying to unravel what was causing this error I also tried using OnSelectedIndexChanging="l
In the "lstSiteVisits_SelectedInd
Protected Sub lstSiteVisits_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstSiteVisits.SelectedIndexChanged
Dim SelID As Integer = 0
SelID = lstSiteVisits.SelectedDataKey.Value
PopulateScreen(SelID)
End Sub
PopulateScreen looks like this:
Public Function PopulateScreen(SiteVisitID As Integer) As Boolean
Dim s As New SiteVisit
Dim ItemToSelect As ListItem = Nothing
Try
If s.GetRecord(SiteVisitID) Then
lblSiteVisitID.Text = "Site Visit ID: " & Format(s.SiteVisitID, "00000000")
lblActionID.Text = "Action ID: " & Format(s.fkActionCalendarID, "00000000")
cboLocation.ClearSelection()
ItemToSelect = cboLocation.Items.FindByText(s.Location)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboLocation.SelectedIndex = -1
End If
mskDate.Text = DF(s.SVDate)
cboTypeOfVisit.ClearSelection()
ItemToSelect = cboTypeOfVisit.Items.FindByText(s.TypeOfVisit)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboTypeOfVisit.SelectedIndex = -1
End If
mskTime.Text = TF(s.SVTime, 1)
cboOfficerName.ClearSelection()
ItemToSelect = cboOfficerName.Items.FindByText(s.OfficerName)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboOfficerName.SelectedIndex = -1
End If
txtSIALicenceNumber.Text = s.SIALicenceNumber
txtSIALicenceExpiry.Text = DF(s.SIALicenceExpiry)
txtIDBadgeExpiry.Text = DF(s.IDBadgeExpiry)
cboPocketBookCompletion.ClearSelection()
ItemToSelect = cboPocketBookCompletion.Items.FindByText(s.PocketBookCompletion)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboPocketBookCompletion.SelectedIndex = -1
End If
cboRecordOfIncidentsComplete.ClearSelection()
ItemToSelect = cboRecordOfIncidentsComplete.Items.FindByText(s.RecordOfIncidentsCompletion)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboRecordOfIncidentsComplete.SelectedIndex = -1
End If
cboECRCrimeReportEtc.ClearSelection()
ItemToSelect = cboECRCrimeReportEtc.Items.FindByText(s.ECRCrimeReportingFaxed)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboECRCrimeReportEtc.SelectedIndex = -1
End If
cboDailyOccurBookComplete.ClearSelection()
ItemToSelect = cboDailyOccurBookComplete.Items.FindByText(s.DailyOccurenceBook)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboDailyOccurBookComplete.SelectedIndex = -1
End If
ItemToSelect = cbTop20LinesIdent.Items.FindByText(s.Top20LineChecked)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cbTop20LinesIdent.SelectedIndex = -1
End If
cboAssignInstructionsUnderstood.ClearSelection()
If s.AssignmentInstructionsUnderstoodAndSignedYN Then
ItemToSelect = cboAssignInstructionsUnderstood.Items.FindByText("Yes")
Else
ItemToSelect = cboAssignInstructionsUnderstood.Items.FindByText("No")
End If
ItemToSelect.Selected = True
txtAssignInstructionsInPlaceDate.Text = DF(s.AssignmentInstructionsInPlaceDate)
cboAssignInstructionsInPlaceYN.ClearSelection()
If s.AssignmentInstructionInPlaceYN Then
ItemToSelect = cboAssignInstructionsInPlaceYN.Items.FindByText("Yes")
Else
ItemToSelect = cboAssignInstructionsInPlaceYN.Items.FindByText("No")
End If
ItemToSelect.Selected = True
txtHealthAndSafetyInPlaceDate.Text = DF(s.HealthAndSafetyDate)
cboHealthAndSafetyInPlaceYN.ClearSelection()
If s.HealthAndSafetyYN Then
ItemToSelect = cboHealthAndSafetyInPlaceYN.Items.FindByText("Yes")
Else
ItemToSelect = cboHealthAndSafetyInPlaceYN.Items.FindByText("No")
End If
ItemToSelect.Selected = True
cboHealthAndSafetyUnderstoodAndSigned.ClearSelection()
If s.HealthAndSafetyRiskAssUnderstoodAndSignedYN Then
ItemToSelect = cboHealthAndSafetyUnderstoodAndSigned.Items.FindByText("Yes")
Else
ItemToSelect = cboHealthAndSafetyUnderstoodAndSigned.Items.FindByText("No")
End If
ItemToSelect.Selected = True
cboJumper.ClearSelection()
ItemToSelect = cboJumper.Items.FindByText(s.JumperDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboJumper.SelectedIndex = -1
End If
cboJacket.ClearSelection()
ItemToSelect = cboJacket.Items.FindByText(s.JacketDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboJacket.SelectedIndex = -1
End If
cboShirt.ClearSelection()
ItemToSelect = cboShirt.Items.FindByText(s.ShirtDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboShirt.SelectedIndex = -1
End If
cboTrousers.ClearSelection()
ItemToSelect = cboTrousers.Items.FindByText(s.TrousersDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboTrousers.SelectedIndex = -1
End If
cboTie.ClearSelection()
ItemToSelect = cboTie.Items.FindByText(s.TieDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboTie.SelectedIndex = -1
End If
cboEppaulettes.ClearSelection()
ItemToSelect = cboEppaulettes.Items.FindByText(s.EppaulettesDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboEppaulettes.SelectedIndex = -1
End If
cboHiVisJacket.ClearSelection()
ItemToSelect = cboHiVisJacket.Items.FindByText(s.HiVisJacketDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboHiVisJacket.SelectedIndex = -1
End If
cboShoesBoots.ClearSelection()
ItemToSelect = cboShoesBoots.Items.FindByText(s.ShoesBootsDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboShoesBoots.SelectedIndex = -1
End If
txtSecurityOfficerSign.Text = s.SecurityOfficerSign
cboManagerName.ClearSelection()
ItemToSelect = cboManagerName.Items.FindByText(s.ManagerDropbox)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboManagerName.SelectedIndex = -1
End If
txtTrainingGiven.Text = s.TrainingInstructionGivenDetailsbox
txtTrainingGivenDate.Text = DF(s.TrainingInstructionGivenDate)
txtFollowUpReq.Text = s.FollowUpActionReqDetails
txtFollowUpReqDate.Text = DF(s.FollowUpActionReqDate)
Else
lblSiteVisitID.Text = "Site Visit ID: " & Format(0, "00000000")
lblActionID.Text = "Action ID: " & Format(0, "00000000")
End If
Return True
Catch ex As Exception
ErrorMessage = PEH("PopulateScreen", "frmSiteVisitForm", ex.Message)
Response.Redirect("ErrorPage.aspx")
Return False
Finally
If Not IsNothing(s) Then
s.Dispose()
End If
End Try
End Function
This just populates all of the drop lists and text boxes in the main part of the page when the user clicks a selection in the list.The whole thing is working fine for nearly all the items in the list but if I page to the last page of records and select the first item at the top of the list I get the above crash.
Stepping through the code when I click the selected item, the call to "lstSiteVisits_SelectedInd
Protected Sub Page_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
If Not Page.IsPostBack Then
PopulateSiteVisitsList(-1, "", "")
End If
End Sub
Because this is a PostBack call the PopulateSiteVisitList call is not made. Then the code moves to my "DataPagerSiteVisits_PreRe
Protected Sub DataPagerSiteVisits_PreRender(sender As Object, e As EventArgs)
If optLocation.Checked Then
PopulateSiteVisitsList(-1, "Location", txtSearch.Text)
End If
If optOfficerName.Checked Then
PopulateSiteVisitsList(-1, "OfficerName", txtSearch.Text)
End If
If optTypeOfVisit.Checked Then
PopulateSiteVisitsList(-1, "TypeOfVisit", txtSearch.Text)
End If
End Sub
This runs the PopulateSiteVisitsList call using the parameters for whichever option button I have selected (the user can filter the ListView by entering a search term into the "txtSearch" text box and clicking a search button), when I am populating the page I can either use the entered text and search type or if the search box is left empty it returns all records the option button is defaulted to the "Location" search type which means the records are ordered by site if no text is entered in the search box.So in the instance where there is no search text entered the "PopulateSiteVisitsList" is called with the parameters as follows:
PopulateSiteVisitsList(-1,
This is PopulateSiteVisitsList:
Public Sub PopulateSiteVisitsList(SiteVisitIDToSelect As Integer, SearchType As String, SearchText As String)
Dim n As Integer = 0
Dim ss As New SiteVisitColl
Dim s As New SiteVisit
Dim SelItem As Integer = 0
Try
lstSiteVisits.Items.Clear()
lstSiteVisits.DataSource = Nothing
'Get the collection of site visit records
ss = s.GetAllSiteVisits(SearchType, SearchText)
If IsNothing(ss) Then
Exit Sub
End If
If ss.Count > 0 Then
If SiteVisitIDToSelect >= 0 Then 'if -1 then we do not attempt to identify the selected item.
If SiteVisitIDToSelect > 0 Then
For n = 0 To ss.Count - 1
If ss(n).SiteVisitID = SiteVisitIDToSelect Then
SelItem = n
Exit For
End If
Next
Else
lstSiteVisits.SelectedIndex = 0
End If
lstSiteVisits.DataSource = ss
lstSiteVisits.DataBind()
lstSiteVisits.SelectedIndex = SelItem
Else
lstSiteVisits.DataSource = ss
lstSiteVisits.DataBind()
End If
End If
Catch ex As Exception
ErrorMessage = PEH("PopulateSiteVisitsList", "frmSiteVisitForm", ex.Message)
Response.Redirect("ErrorPage.aspx")
Finally
If Not IsNothing(ss) Then
ss.Dispose()
s.Dispose()
End If
End Try
End Sub
When this routine completes (again there is no error as the code is being stepped through) there is a short delay and then the error occurs, so it feels like the error is being thrown outside of my code?Can anyone point me to why this error is occurring and how to fix it. I have researched this error on the net and nothing I have found seems to make any difference?
Siv
Where are you getting this error? I mean which line of code?
ASKER
Ramkisan,
As I mentioned above this error occurs after my code completes so it appears to be outside my code? When I step the code I do not get the error at all it's occurring after I step out of the following sub:
Protected Sub DataPagerSiteVisits_PreRen der(sender As Object, e As EventArgs)
If optLocation.Checked Then
PopulateSiteVisitsList(-1, "Location", txtSearch.Text)
End If
If optOfficerName.Checked Then
PopulateSiteVisitsList(-1, "OfficerName", txtSearch.Text)
End If
If optTypeOfVisit.Checked Then
PopulateSiteVisitsList(-1, "TypeOfVisit", txtSearch.Text)
End If
End Sub
I stepped the code all the way through the call to "PopulateSiteVisitsList" and it returns from that without throwing any error and then I hit the "Exit Sub" above and clearly something happens just after that and then I get the error page displayed in IE.
So as far as I can tell it's occurring after my code completes and just as the page is drawn in IE.
Siv
As I mentioned above this error occurs after my code completes so it appears to be outside my code? When I step the code I do not get the error at all it's occurring after I step out of the following sub:
Protected Sub DataPagerSiteVisits_PreRen
If optLocation.Checked Then
PopulateSiteVisitsList(-1,
End If
If optOfficerName.Checked Then
PopulateSiteVisitsList(-1,
End If
If optTypeOfVisit.Checked Then
PopulateSiteVisitsList(-1,
End If
End Sub
I stepped the code all the way through the call to "PopulateSiteVisitsList" and it returns from that without throwing any error and then I hit the "Exit Sub" above and clearly something happens just after that and then I get the error page displayed in IE.
So as far as I can tell it's occurring after my code completes and just as the page is drawn in IE.
Siv
ASKER
As you can see from the stack trace it doesn't mention any particular dropdown name in the stack trace so I cannot work out where the issue is?
Siv
Siv
Please debug and check where it is giving this error?
ASKER
I don't know how to do any more than I have, what do you mean by debug (I put a break point on the first line of the "lstSiteVisits_SelectedInd exChanged" subroutine and then step the code line by line from that point onwards) and in doing so I find that no error is thrown until I get to the end of the "DataPagerSiteVisits_PreRe nder" sub which is the last call before the page is output to Internet Explorer. The code from my perspective is complete, I don't particularly want it to call the " DataPagerSiteVisits_PreRen der" but that seems to be as a result of rendering the page which calls the "Page_PreRender" and then the "DataPagerSiteVisits_PreRe nder" as part of normal page creation.
Once the "DataPagerSiteVisits_PreRe nder" is called it calls a routine which draws the ListView again (PopulateSiteVisitsList) and I have stepped that process and again it does not generate any errors, it's only when that completes and I return to the "DataPagerSiteVisits_PreRe nder" routine and step to the "Exit Sub" at the end of that at which point, the page is drawn to IE I assume that the IE page shows the error. All the stuff that I do that selects the relevant items in the dropdown lists is stepped through without any error. My only concern is why that gets called twice, it may be that my code is called the first time by the action of selecting the item in the ListView which populates the screen and then that gets called again by a postback? In my early attempts to suss out what was going on I actually put a check for "IsPostback" and if it was I then skipped the PopulateScreen call but that seemed to stop the selection process working in the ListView and the selection highlighter was always one refresh behind.
Siv
Once the "DataPagerSiteVisits_PreRe
Siv
ASKER
I have now put a Try Catch around the DataPagerSiteVisits_PreRen der routine as this is the routine that when I exit it leads to the error report and after doing this and restarting the code I still get the stack trace so clearly the error occurs after my code? This is how the routine looks now with my error handler wrapped around it and my error routine is not called so the error is after my code and somewhere in ASP.NET or the Visual Basic part of Dot Net?
Protected Sub DataPagerSiteVisits_PreRen der(sender As Object, e As EventArgs)
Try
If optLocation.Checked Then
PopulateSiteVisitsList(-1, "Location", txtSearch.Text)
End If
If optOfficerName.Checked Then
PopulateSiteVisitsList(-1, "OfficerName", txtSearch.Text)
End If
If optTypeOfVisit.Checked Then
PopulateSiteVisitsList(-1, "TypeOfVisit", txtSearch.Text)
End If
Catch ex As Exception
ErrorMessage = PEH("DataPagerSiteVisits_P reRender", "frmSiteVisit", ex.Message)
Response.Redirect("ErrorPa ge.aspx")
End Try
Protected Sub DataPagerSiteVisits_PreRen
Try
If optLocation.Checked Then
PopulateSiteVisitsList(-1,
End If
If optOfficerName.Checked Then
PopulateSiteVisitsList(-1,
End If
If optTypeOfVisit.Checked Then
PopulateSiteVisitsList(-1,
End If
Catch ex As Exception
ErrorMessage = PEH("DataPagerSiteVisits_P
Response.Redirect("ErrorPa
End Try
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
pcelba,
Can you point me to where the problem line is as I cannot see anything in the stack trace that appears to be a droplist in my code?
Siv
Can you point me to where the problem line is as I cannot see anything in the stack trace that appears to be a droplist in my code?
Siv
Look at the first four lines of stack trace:
System.Web.UI.WebControls. DropDownList.VerifyMultiSelect() +106
System.Web.UI.WebControls. ListControl.RenderContents(HtmlTextWr iter writer) +9630133
System.Web.UI.WebControls. WebControl .Render(Ht mlTextWrit er writer) +32
The ListControl.RenderContents seems to be generated (or nonsense which could explain the exception) but you should place breakpoints to these methods. VerifyMultiSelect() seems to be your code so check it as the first instance.
How many items contains your ListControl?
System.Web.UI.WebControls.
System.Web.UI.WebControls.
System.Web.UI.WebControls.
The ListControl.RenderContents
How many items contains your ListControl?
ASKER
pcelba,
That's not my function, I think this is .Net code it's hitting the problem in. In my code I explicitly clear every drop list before I try to set it to the value that is held in the database, if the value is matched I set the SelectedIndex to the item that matches, if not it stays cleared, here is the first droplist I try and select an item in, it is copied from the "PopulateScreen" function I have listed in my original question:
Dim ItemToSelect As ListItem = Nothing
cboLocation.ClearSelection ()
ItemToSelect = cboLocation.Items.FindByTe xt(s.Locat ion)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboLocation.SelectedIndex = -1
End If
s is a class that matches to the "SiteVisit" table in my SQL database and holds the record we are currently displaying in the screen. I have checked my code and as far as I can tell every occasion where I am trying to make a selection in a drop list I first run the "ClearSelection" on the relevant drop down that I am trying to select an item in.
So if for any reason the item in the database is not found the drop down list's selection has been cleared first so I should never hit a situation where I have more than one selected item?
I think the issue could be something to do with the fact that the page is being redrawn twice. The reason I say this is that I have a save button on the page and I have a click event that is called to save the record on screen and if I step the code in that it gets called OK and just when I think it has completed the click event fires again and it's generating a second row of the same data in the database. I think if I could pin down why everything on this page seems to get called twice, this issue might go away?
Siv
That's not my function, I think this is .Net code it's hitting the problem in. In my code I explicitly clear every drop list before I try to set it to the value that is held in the database, if the value is matched I set the SelectedIndex to the item that matches, if not it stays cleared, here is the first droplist I try and select an item in, it is copied from the "PopulateScreen" function I have listed in my original question:
Dim ItemToSelect As ListItem = Nothing
cboLocation.ClearSelection
ItemToSelect = cboLocation.Items.FindByTe
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboLocation.SelectedIndex = -1
End If
s is a class that matches to the "SiteVisit" table in my SQL database and holds the record we are currently displaying in the screen. I have checked my code and as far as I can tell every occasion where I am trying to make a selection in a drop list I first run the "ClearSelection" on the relevant drop down that I am trying to select an item in.
So if for any reason the item in the database is not found the drop down list's selection has been cleared first so I should never hit a situation where I have more than one selected item?
I think the issue could be something to do with the fact that the page is being redrawn twice. The reason I say this is that I have a save button on the page and I have a click event that is called to save the record on screen and if I step the code in that it gets called OK and just when I think it has completed the click event fires again and it's generating a second row of the same data in the database. I think if I could pin down why everything on this page seems to get called twice, this issue might go away?
Siv
So if some method is called twice then place a breakpoint to this method and check the calling stack. It should identify the method call origin. A quick workaround is to identify such duplicate call and return immediately which can help temporarily.
Yes. You may display the External code: http://blogs.msdn.com/b/zainnab/archive/2010/10/24/show-external-code-vstipdebug0031.aspx
ASKER
Pavel,
OK this is the stack trace with external code turned on when entering the SelectedIndexChanging event the first time (ie when the entry in the ListView is first clicked:
> App_Web_ihso54ew.dll!frmSi teVisit.ls tSiteVisit s_Selected IndexChang ing(Object sender, System.Web.UI.WebControls. ListViewSe lectEventA rgs e) Line 85 Basic
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.OnSel ectedIndex Changing(S ystem.Web. UI.WebCont rols.ListV iewSelectE ventArgs e) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.Handl eSelect(in t itemIndex) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.Handl eEvent(Sys tem.EventA rgs e, bool causesValidation, string validationGroup) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.OnBub bleEvent(o bject source, System.EventArgs e) Unknown
System.Web.dll!System.Web. UI.Control .RaiseBubb leEvent(ob ject source, System.EventArgs args) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List ViewDataIt em.OnBubbl eEvent(obj ect source, System.EventArgs e) Unknown
System.Web.dll!System.Web. UI.Control .RaiseBubb leEvent(ob ject source, System.EventArgs args) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.OnCo mmand(Syst em.Web.UI. WebControl s.CommandE ventArgs e) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.Rais ePostBackE vent(strin g eventArgument) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.Syst em.Web.UI. IPostBackE ventHandle r.RaisePos tBackEvent (string eventArgument) Unknown
System.Web.dll!System.Web. UI.Page.Ra isePostBac kEvent(Sys tem.Web.UI .IPostBack EventHandl er sourceControl, string eventArgument) Unknown
System.Web.dll!System.Web. UI.Page.Ra isePostBac kEvent(Sys tem.Collec tions.Spec ialized.Na meValueCol lection postData) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque stMain(boo l includeStagesBeforeAsyncPo int, bool includeStagesAfterAsyncPoi nt) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st(bool includeStagesBeforeAsyncPo int, bool includeStagesAfterAsyncPoi nt) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st() Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque stWithNoAs sert(Syste m.Web.Http Context context) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st(System. Web.HttpCo ntext context) Unknown
App_Web_ihso54ew.dll!ASP.f rmsitevisi t_aspx.Pro cessReques t(System.W eb.HttpCon text context) Basic
System.Web.dll!System.Web. HttpApplic ation.Call HandlerExe cutionStep .System.We b.HttpAppl ication.IE xecutionSt ep.Execute () Unknown
System.Web.dll!System.Web. HttpApplic ation.Exec uteStep(Sy stem.Web.H ttpApplica tion.IExec utionStep step, ref bool completedSynchronously) Unknown
System.Web.dll!System.Web. HttpApplic ation.Pipe lineStepMa nager.Resu meSteps(Sy stem.Excep tion error) Unknown
System.Web.dll!System.Web. HttpApplic ation.Begi nProcessRe questNotif ication(Sy stem.Web.H ttpContext context, System.AsyncCallback cb) Unknown
System.Web.dll!System.Web. HttpRuntim e.ProcessR equestNoti ficationPr ivate(Syst em.Web.Hos ting.IIS7W orkerReque st wr, System.Web.HttpContext context) Unknown
System.Web.dll!System.Web. Hosting.Pi pelineRunt ime.Proces sRequestNo tification Helper(Sys tem.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) Unknown
System.Web.dll!System.Web. Hosting.Pi pelineRunt ime.Proces sRequestNo tification (System.In tPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) Unknown
[AppDomain Transition]
This is the stack trace the second time it is called and just prior to the crash occuring:
> App_Web_ihso54ew.dll!frmSi teVisit.ls tSiteVisit s_Selected IndexChang ing(Object sender, System.Web.UI.WebControls. ListViewSe lectEventA rgs e) Line 85 Basic
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.OnSel ectedIndex Changing(S ystem.Web. UI.WebCont rols.ListV iewSelectE ventArgs e) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.Handl eSelect(in t itemIndex) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.Handl eEvent(Sys tem.EventA rgs e, bool causesValidation, string validationGroup) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List View.OnBub bleEvent(o bject source, System.EventArgs e) Unknown
System.Web.dll!System.Web. UI.Control .RaiseBubb leEvent(ob ject source, System.EventArgs args) Unknown
System.Web.Extensions.dll! System.Web .UI.WebCon trols.List ViewDataIt em.OnBubbl eEvent(obj ect source, System.EventArgs e) Unknown
System.Web.dll!System.Web. UI.Control .RaiseBubb leEvent(ob ject source, System.EventArgs args) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.OnCo mmand(Syst em.Web.UI. WebControl s.CommandE ventArgs e) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.Rais ePostBackE vent(strin g eventArgument) Unknown
System.Web.dll!System.Web. UI.WebCont rols.LinkB utton.Syst em.Web.UI. IPostBackE ventHandle r.RaisePos tBackEvent (string eventArgument) Unknown
System.Web.dll!System.Web. UI.Page.Ra isePostBac kEvent(Sys tem.Web.UI .IPostBack EventHandl er sourceControl, string eventArgument) Unknown
System.Web.dll!System.Web. UI.Page.Ra isePostBac kEvent(Sys tem.Collec tions.Spec ialized.Na meValueCol lection postData) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque stMain(boo l includeStagesBeforeAsyncPo int, bool includeStagesAfterAsyncPoi nt) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st(bool includeStagesBeforeAsyncPo int, bool includeStagesAfterAsyncPoi nt) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st() Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque stWithNoAs sert(Syste m.Web.Http Context context) Unknown
System.Web.dll!System.Web. UI.Page.Pr ocessReque st(System. Web.HttpCo ntext context) Unknown
App_Web_ihso54ew.dll!ASP.f rmsitevisi t_aspx.Pro cessReques t(System.W eb.HttpCon text context) Basic
System.Web.dll!System.Web. HttpApplic ation.Call HandlerExe cutionStep .System.We b.HttpAppl ication.IE xecutionSt ep.Execute () Unknown
System.Web.dll!System.Web. HttpApplic ation.Exec uteStep(Sy stem.Web.H ttpApplica tion.IExec utionStep step, ref bool completedSynchronously) Unknown
System.Web.dll!System.Web. HttpApplic ation.Pipe lineStepMa nager.Resu meSteps(Sy stem.Excep tion error) Unknown
System.Web.dll!System.Web. HttpApplic ation.Begi nProcessRe questNotif ication(Sy stem.Web.H ttpContext context, System.AsyncCallback cb) Unknown
System.Web.dll!System.Web. HttpRuntim e.ProcessR equestNoti ficationPr ivate(Syst em.Web.Hos ting.IIS7W orkerReque st wr, System.Web.HttpContext context) Unknown
System.Web.dll!System.Web. Hosting.Pi pelineRunt ime.Proces sRequestNo tification Helper(Sys tem.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) Unknown
System.Web.dll!System.Web. Hosting.Pi pelineRunt ime.Proces sRequestNo tification (System.In tPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) Unknown
[AppDomain Transition]
I am confused?
Siv
OK this is the stack trace with external code turned on when entering the SelectedIndexChanging event the first time (ie when the entry in the ListView is first clicked:
> App_Web_ihso54ew.dll!frmSi
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.dll!System.Web.
System.Web.Extensions.dll!
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
App_Web_ihso54ew.dll!ASP.f
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
[AppDomain Transition]
This is the stack trace the second time it is called and just prior to the crash occuring:
> App_Web_ihso54ew.dll!frmSi
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.Extensions.dll!
System.Web.dll!System.Web.
System.Web.Extensions.dll!
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
App_Web_ihso54ew.dll!ASP.f
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
System.Web.dll!System.Web.
[AppDomain Transition]
I am confused?
Siv
ASKER
I just stepped the code again after changing the PopulateScreen routine to see if I made a change to the routines made any difference, the change I made was to remove the SelectedIndex=-1.
I.e. From:
cboLocation.ClearSelection ()
ItemToSelect = cboLocation.Items.FindByTe xt(s.Locat ion)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboLocation.SelectedIndex = -1
End If
To:
cboLocation.ClearSelection ()
ItemToSelect = cboLocation.Items.FindByTe xt(s.Locat ion)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
End If
As I was concerned that somehow the setting of the SelectedIndex might be the issue?
It seems to not make any difference, what I did notice was that the calls being made to the "lstSiteVisits_SelectedInd exChanged" routine were sometimes hitting an error where the "lstSiteVisits.SelectedDat aKey" was set to NOTHING so I trapped that by changing the routine like this:
Protected Sub lstSiteVisits_SelectedInde xChanging( sender As Object, e As ListViewSelectEventArgs) Handles lstSiteVisits.SelectedInde xChanging
Dim SelID As Integer = 0
Try
If Not IsNothing(lstSiteVisits.Se lectedData Key) Then
SelID = lstSiteVisits.SelectedData Key.Value
PopulateScreen(SelID)
End If
Catch ex As Exception
ErrorMessage = PEH("lstSiteVisits_Selecte dIndexChan ging", "frmSiteVisit", ex.Message)
Response.Redirect("ErrorPa ge.aspx")
End Try
End Sub
Again this did not stop the error occurring?
I would really like to know why everything on this page gets called twice, it seems to be postbacks? Could I send you the full aspx page and the code behind page, perhaps you can see something so obvious that I am missing?
Siv
I.e. From:
cboLocation.ClearSelection
ItemToSelect = cboLocation.Items.FindByTe
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cboLocation.SelectedIndex = -1
End If
To:
cboLocation.ClearSelection
ItemToSelect = cboLocation.Items.FindByTe
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
End If
As I was concerned that somehow the setting of the SelectedIndex might be the issue?
It seems to not make any difference, what I did notice was that the calls being made to the "lstSiteVisits_SelectedInd
Protected Sub lstSiteVisits_SelectedInde
Dim SelID As Integer = 0
Try
If Not IsNothing(lstSiteVisits.Se
SelID = lstSiteVisits.SelectedData
PopulateScreen(SelID)
End If
Catch ex As Exception
ErrorMessage = PEH("lstSiteVisits_Selecte
Response.Redirect("ErrorPa
End Try
End Sub
Again this did not stop the error occurring?
I would really like to know why everything on this page gets called twice, it seems to be postbacks? Could I send you the full aspx page and the code behind page, perhaps you can see something so obvious that I am missing?
Siv
Setting SelectedIndex = -1 cannot cause the "Cannot have multiple items selected in a DropDownList." exception.
You should rather check if there is some item selected prior to the
SelID = lstSiteVisits.SelectedData Key.Value
PopulateScreen(SelID)
and if yes then unselect it first or don't call the PopulateScreen which causes the exception probably.
You code would be very long reading to me probably. I am also learning ASP.NET but on different heap of code...
You have to code each web page event as an independent entity so it can be called from zero to several times without side effects. Each step you do in the code must check if it is possible to do it. And default values must be ready in the case the event is not fired...
You should rather check if there is some item selected prior to the
SelID = lstSiteVisits.SelectedData
PopulateScreen(SelID)
and if yes then unselect it first or don't call the PopulateScreen which causes the exception probably.
You code would be very long reading to me probably. I am also learning ASP.NET but on different heap of code...
You have to code each web page event as an independent entity so it can be called from zero to several times without side effects. Each step you do in the code must check if it is possible to do it. And default values must be ready in the case the event is not fired...
ASKER
Pavel,
This is my problem as it appears that the error occurs when not in my code so it's very hard to see where the issue is.
The more I look into it the more I am of the opinion that I need to understand why the page keeps making events fire multiple times. The thing that seems to happen last before the error occurs is the call to DataPagerSiteVisits_PreRen der which I find strange as at this point I am not changing the page of ListView data I am just selecting one of the items in the ListView that's controlled by the DataPager.
Siv
This is my problem as it appears that the error occurs when not in my code so it's very hard to see where the issue is.
The more I look into it the more I am of the opinion that I need to understand why the page keeps making events fire multiple times. The thing that seems to happen last before the error occurs is the call to DataPagerSiteVisits_PreRen
Siv
I've found these two pages helpful to understand the ASP.NET events:
http://devio.wordpress.com/2008/03/26/aspnet-page-and-control-lifecycle/
http://blogs.thesitedoctor.co.uk/tim/2006/06/30/Complete+Lifecycle+Of+An+ASPNet+Page+And+Controls.aspx
It is something which needs long learning and which also needs to study code from others...
Both PreRender and Render events are fired and you have to live with it :-(.
http://devio.wordpress.com/2008/03/26/aspnet-page-and-control-lifecycle/
http://blogs.thesitedoctor.co.uk/tim/2006/06/30/Complete+Lifecycle+Of+An+ASPNet+Page+And+Controls.aspx
It is something which needs long learning and which also needs to study code from others...
Both PreRender and Render events are fired and you have to live with it :-(.
ASKER
Pavel,
Thanks for these I'll have a look at them and see if I can figure out what's causing the problem.
Siv
Thanks for these I'll have a look at them and see if I can figure out what's causing the problem.
Siv
ASKER
Pavel,
Finally after going round the houses and back again I have poured over my code that populates the screen and found the bug, it was there in plain view all the time. The following is taken from my code for as it was originally in the "PopulateScreen" question right at the top:
The issue is that I had forgotten the ClearSelection method on the "cbTop20LinesIdent" DropDown list. The net result was that if when visiting one record that DropDown was populated and then you went to another item that was also populated, because I had not cleared the DropDown first, it was being assigned another selected value and of course triggered the error. It's just annoying that the error does not get raised when in my code but only when my code has finished processing and Visual Studio sends the rendered page to IE. It's only then that the error is hit and the stack trace you get gives no clue as to which drop down it is that is being given two selected items.
Because I was convinced that it was something to do with the double posting effect I wasted a lot of time hunting for a fix for that rather than focussing on what the error was telling me. Ah well, you live and learn.
So this issue is now cleared and my page works beautifully.
Thanks for all your help, even though you didn't give me the actual solution your help talking it through with me has allowed me to find the issue. I was getting nowhere on my own.
Siv
Finally after going round the houses and back again I have poured over my code that populates the screen and found the bug, it was there in plain view all the time. The following is taken from my code for as it was originally in the "PopulateScreen" question right at the top:
End If
ItemToSelect = cbTop20LinesIdent.Items.FindByText(s.Top20LineChecked)
If Not IsNothing(ItemToSelect) Then
ItemToSelect.Selected = True
Else
cbTop20LinesIdent.SelectedIndex = -1
End If
cboAssignInstructionsUnderstood.ClearSelection()
The issue is that I had forgotten the ClearSelection method on the "cbTop20LinesIdent" DropDown list. The net result was that if when visiting one record that DropDown was populated and then you went to another item that was also populated, because I had not cleared the DropDown first, it was being assigned another selected value and of course triggered the error. It's just annoying that the error does not get raised when in my code but only when my code has finished processing and Visual Studio sends the rendered page to IE. It's only then that the error is hit and the stack trace you get gives no clue as to which drop down it is that is being given two selected items.
Because I was convinced that it was something to do with the double posting effect I wasted a lot of time hunting for a fix for that rather than focussing on what the error was telling me. Ah well, you live and learn.
So this issue is now cleared and my page works beautifully.
Thanks for all your help, even though you didn't give me the actual solution your help talking it through with me has allowed me to find the issue. I was getting nowhere on my own.
Siv
ASKER
Pavel,
This was the solution in that it is true what you are saying I just couldn't see that it was me failing to clear one of the twenty or so drop downs that appear on my page in the PopulateScreen function. If anyone else is having this issue see my last comment where I highlight the lines causing the issue.
Thanks for talking this through with me it helped having someone else to bounce my thoughts off.
Siv
This was the solution in that it is true what you are saying I just couldn't see that it was me failing to clear one of the twenty or so drop downs that appear on my page in the PopulateScreen function. If anyone else is having this issue see my last comment where I highlight the lines causing the issue.
Thanks for talking this through with me it helped having someone else to bounce my thoughts off.
Siv
You are welcome!