2

ページを更新すると、サブジェクトエラーが表示されます(データバインディングはページの読み込み時に実行されます)。ページのコードをステップスルーすると、エラーはなく、スタックトレースで参照されているページもありません。

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) +161
   System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   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) +27
   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) +208
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   System.Web.UI.UpdatePanel.RenderChildren(HtmlTextWriter writer) +256
   System.Web.UI.UpdatePanel.Render(HtmlTextWriter writer) +37
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +173
   System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +31
   System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +53
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   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) +208
   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) +27
   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) +3060

最後にこれが起こったとき、私はマスターページにこの画像タグを持っていました:

<img src="<%=Page.ResoveUrl("~/Images/footerLogo.png") %>" />

<% %>これを変更して( )ブロックを削除する<img src="/Images/footerLogo.png" />とエラーが修正されましたが、今回はマスターページ(または問題のページにリンクしているページ)にそのようなタグはありません。これが私のコードです:

Imports MySql.Data
Imports MySql.Data.MySqlClient

Partial Class maintreservation
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not IsPostBack Then

            getClients()
            getDrivers()
            getVehicles()

            pnlDriven.Visible = False
            pnlSelfDriven.Visible = False

            If Not String.IsNullOrEmpty(Session("resid")) AndAlso Session("resid") IsNot Nothing Then

                getReservation()

            End If

        End If
    End Sub

    Protected Sub getDrivers()
        ddlDriver.ClearSelection()

        Dim db As New Database

        Dim sql As String = "select driverid, drivername from drivers order by drivername"

        Dim dr As MySqlDataReader = db.GetReader(sql)

        If dr.Read Then

            ddlDriver.DataSource = dr
            ddlDriver.DataTextField = "drivername"
            ddlDriver.DataValueField = "driverid"
            ddlDriver.DataBind()

        End If
        dr.Close()

        ddlDriver.Items.Insert(0, New ListItem("Select a Driver", 0))
    End Sub

    Protected Sub getVehicles()
        ddlVehicle.ClearSelection()

        Dim db As New Database

        Dim sql As String = "select veh.vehicleid, veh.licence_plate, veh.model, vm.make from vehicles veh " & _
            "inner join vehicle_manufacturers vm on veh.make = vm.makeid order by veh.make"

        Dim dr As MySqlDataReader = db.GetReader(sql)

        While dr.Read

            ddlVehicle.Items.Add(New ListItem(dr("make") & " " & dr("model") & " " & " (" & dr("licence_plate") & ")", dr("vehicleid")))
        End While
        dr.Close()

        ddlVehicle.Items.Insert(0, New ListItem("Select a Vehicle", 0))
    End Sub

    Protected Sub getClients()
        ddlClient.ClearSelection()

        Dim db As New Database

        Dim sql As String = "select clientid, clientname, contact from clients order by clientname"

        Dim dr As MySqlDataReader = db.GetReader(sql)

        If dr.Read Then

            ddlClient.DataSource = dr
            ddlClient.DataTextField = "clientname"
            ddlClient.DataValueField = "clientid"
            ddlClient.DataBind()

        End If
        dr.Close()

        ddlClient.Items.Insert(0, New ListItem("Select an Agent", 0))
        getClientContact()
    End Sub

    Protected Sub getClientContact()

        Dim db As New Database

        Dim sql As String = "select contact, vat_no from clients where clientid = " & ddlClient.SelectedItem.Value

        Dim dr As MySqlDataReader = db.GetReader(sql)

        If dr.Read Then

            If Not IsDBNull(dr("contact")) Then
                lblClientContact.Text = dr("contact")
            Else
                lblClientContact.Text = ""
            End If
            If Not IsDBNull(dr("vat_no")) Then
                txtVatNo.Text = dr("vat_no")
            Else
                txtVatNo.Text = ""
            End If
        End If
        dr.Close()
    End Sub

    Protected Sub ddlClient_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlClient.SelectedIndexChanged

        getClientContact()

    End Sub

    Protected Sub getReservation()

        Dim db As New Database

        Dim sql As String = _
            "select * from reservations res " & _
            "inner join reservationbody trip on res.reservationid = trip.reservationid " & _
            "inner join vehicles vehicle on trip.vehicleid = vehicle.vehicleid " & _
            "left outer join drivers driver on trip.driverid = driver.driverid " & _
            "where res.reservationid = " & Session("resid")

        Dim dr As MySqlDataReader = db.GetReader(sql)

        If dr.Read Then

            ' GET CLIENT
            ' -------------------------------------------------------------
            ddlClient.ClearSelection()
            ddlClient.Items.FindByValue(dr("clientid")).Selected = True
            getClientContact()

            ' GET VOUCHER
            ' -------------------------------------------------------------
            If IsDBNull("vouchernumber") Then
                txtVoucher.Text = ""
            Else
                txtVoucher.Text = dr("vouchernumber")
            End If

            ' GET DRIVER
            ' -------------------------------------------------------------
            If dr("driverid") = "0" Then
                ' Self Drive
                rblTrips.Items(1).Selected = True

                pnlDriven.Visible = False
                pnlSelfDriven.Visible = True

            Else
                ' Driven
                rblTrips.Items(0).Selected = True

                pnlSelfDriven.Visible = False
                pnlDriven.Visible = True

                ddlDriver.ClearSelection()
                ddlDriver.Items.FindByValue(dr("driverid")).Selected = True
            End If

            ' GET PASSENGER/S
            ' -------------------------------------------------------------
            If IsDBNull(dr("passengers")) Then
                txtPassengers.Text = ""
            Else
                txtPassengers.Text = dr("passengers")
            End If
            If IsDBNull(dr("passengercontact")) Then
                txtPassengerContact.Text = ""
            Else
                txtPassengerContact.Text = dr("passengercontact")
            End If

            ' GET COMMENTS
            ' -------------------------------------------------------------
            If IsDBNull(dr("comments")) Then
                txtComments.Text = ""
            Else
                txtComments.Text = dr("comments")
            End If

            ' GET VEHICLES
            ' -------------------------------------------------------------
            ddlVehicle.ClearSelection()
            ddlDriver.Items.FindByValue(dr("vehicleid")).Selected = True

            ' GET DATES AND TIMES
            ' -------------------------------------------------------------
            txtPickupDate.Text = Left(dr("res_date"), 10) ' USE DATE(trip.res_date) as res_date in the sql statement

            ucTimeIn.Time = dr("time_in")

            ucTimeOut.Time = dr("time_out")

        End If
        dr.Close()
    End Sub

    Protected Sub rblTrips_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rblTrips.SelectedIndexChanged

        If rblTrips.SelectedItem.Value = "driven" Then

            pnlDriven.Visible = True
            pnlSelfDriven.Visible = False

        Else

            pnlSelfDriven.Visible = True
            pnlDriven.Visible = False

        End If
    End Sub

End Class

述べたように、このコードは完全に実行されるので、ここで問題が何であるかについて私は本当に途方に暮れています。

ソリューションのクリーニングと再構築を試しましたが、まだ何も修正されていないため、洞察を歓迎します。

4

3 に答える 3

4

からの入力により、Cory戻って、すべてのDropDownListに1つの選択しか指定されていないことを確認することにしました。そのときに、問題が見つかりました。

上記getReservation()

        ' GET DRIVER
        ' -------------------------------------------------------------
        If dr("driverid") = "0" Then
            ' Self Drive
            rblTrips.Items(1).Selected = True

            pnlDriven.Visible = False
            pnlSelfDriven.Visible = True

        Else
            ' Driven
            rblTrips.Items(0).Selected = True

            pnlSelfDriven.Visible = False
            pnlDriven.Visible = True

            ddlDriver.ClearSelection()
            ddlDriver.Items.FindByValue(dr("driverid")).Selected = True
        End If

そして後で:

        ' GET VEHICLES
        ' -------------------------------------------------------------
        ddlVehicle.ClearSelection()
        ddlDriver.Items.FindByValue(dr("vehicleid")).Selected = True

これは単に悪いコピー/貼り付けだったので、この回答を見ている人は、1回だけ選択していることを100%確認してください

ちなみに、次の方が良い方法だと言われています。

' Do this:
ddlVehicles.SelectedValue = dr("vehicleid")

' Instead of this:
ddlVehicles.Items.FindByValue(dr("vehicleid").Selected = True
于 2012-08-30T13:42:04.777 に答える
2

いずれかListControlがレンダリングされているときに、選択されたアイテムが複数ある場合はフラグが設定されます。フラグがtrueの場合、抽象メソッドVerifyMultiSelectが呼び出されます。DropDownListの実装でVerifyMultiSelectは、選択された複数のアイテムが検出された場合に例外がスローされるため、この例外が発生する唯一の理由は、の1つに複数ListItemのがSelected設定されているためです。trueDropDownList

SQLの結果を注意深く調べて、同じアイテム内の複数のアイテムのプロパティがに設定されてDropDownListいる場合があるかどうかを判断します。上記のサンプルの関数には、このプロパティを変更する3行のコードがあります。SelectedtruegetReservation()

おそらくそれはあなたが扱う方法ですIsPostBack。そのコントロール用に以前に選択されたアイテムが保存されViewStateており、ポストバック後にそれと一緒に別の値を選択しようとしています。

編集: OPは解決策を見つけました。

于 2012-08-30T13:31:09.303 に答える
2

他の誰かの古いコードを作り直したときにも同様の問題がありました。私にとって、それは単に電話することによって対処されたビューステートの問題でした

myDropDown.ClearSelection(); 

彼らは、キーのない列挙型からドロップダウンのデータソースをプルしていたため、FindTextを使用して選択を行いました。ドロップダウンで選択したアイテムが変更された場合でも、最初に呼び出すことなく、FindTextを使用してPostBackでステートメントを再実行しました

myDropDown.ClearSelection();

これは、Corysの返信によると、2つのアイテム(選択したばかりのアイテムとビューステートで既に選択されているアイテム)が選択されたため、例外がスローされたことを意味します。

これまでどのように機能したかはわかりませんが、コードに小さな変更が加えられるまで公開されませんでした。したがって、OPの回答に従ってコードの重複行を見つけるのに苦労している場合は、ポストバックのビューステートメカニズムを検討することもできます。

于 2013-06-12T03:44:04.510 に答える