【问题标题】:Change dropdownlist value without autopostback在没有自动回发的情况下更改下拉列表值
【发布时间】:2021-11-12 12:31:27
【问题描述】:

如何使用 vb.net 在 asp.net 中根据另一个下拉列表值更改下拉列表值而不自动回发

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    好吧,如果你不回发,那么没有代码可以运行。

    您可以开始使用 ajax 调用。这允许您在没有页面回发的情况下调用 + 使用服务器端代码。但这意味着您必须在客户端编写一些 JavaScript 代码。

    但是,这里的回发并不是世界末日。

    还有一个介于两者之间的选择,您只发回两个组合框,这导致几乎只发布两个组合框,页面的其余部分将保持不变。

    这意味着 asp.net 为您准备了 ajax 连接!!!

    所以,我们有这两个组合框。第一个选择城市,第二个是该城市的酒店。

            <div style="float:left">
                <h3>Select City</h3>
                <asp:DropDownList ID="cboCity" runat="server" Width="168px"
                    DataValueField="City" DataTextField="City" AutoPostBack="true"></asp:DropDownList>
            </div>
    
            <div style="float:left;margin-left:25px">
                <h3>Select Hotel</h3>
                <asp:DropDownList ID="cboHotels" runat="server" Width="168px"
                    DataValueField="ID" DataTextField = "HotelName"
                    ></asp:DropDownList>
            </div>
    

    好的,请注意我们的第一个组合框具有自动回发功能。

    我们的代码是这样的:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
        If Not IsPostBack Then
            ' load up City combo
            cboCity.DataSource = MyrstP(New SqlCommand("SELECT City from City ORDER BY City"))
            cboCity.DataBind()
            cboCity.Items.Insert(0, "")  ' Add blank row selecting
        End If
    
    End Sub
    

    第一个组合框代码是这样的:

    Protected Sub cboCity_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboCity.SelectedIndexChanged
    
        ' cascade City and limit hotels from given city.
    
        Using cmdSQL As New SqlCommand("SELECT ID, HotelName FROM tblHotels 
                                      WHERE City = @City ORDER BY HotelName")
    
            cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = cboCity.SelectedItem.Text
    
            cboHotels.DataSource = MyrstP(cmdSQL)
            cboHotels.DataBind()
            cboHotels.Items.Insert(0, New ListItem("Select Hotel", 0))
    
        End Using
    

    还有让生活更轻松的辅助例程:

     Public Function MyrstP(sqlCmd As SqlCommand) As DataTable
    
        Dim rstData As New DataTable
    
        Using sqlCmd
            sqlCmd.Connection = New SqlConnection(My.Settings.TEST4)
            sqlCmd.Connection.Open()
            rstData.Load(sqlCmd.ExecuteReader)
        End Using
    
        Return rstData
    
    End Function
    

    (注意非常小心,我们从来没有创建连接对象然后在以后使用它,但是我们在 sql 命令中使用 BUILT IN one。

    好的,

    现在让我们将其更改为不整页回发。

    这样做:

            <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
    
            <div style="float:left">
                <h3>Select City</h3>
                <asp:DropDownList ID="cboCity" runat="server" Width="168px"
                    DataValueField="City" DataTextField="City" AutoPostBack="true"></asp:DropDownList>
            </div>
    
            <div style="float:left;margin-left:25px">
                <h3>Select Hotel</h3>
                <asp:DropDownList ID="cboHotels" runat="server" Width="168px"
                    DataValueField="ID" DataTextField = "HotelName"
                    ></asp:DropDownList>
            </div>
    
            </ContentTemplate>
            </asp:UpdatePanel>
    

    现在试一试!!! - 注意页面如何不再回发。

    这仍然是部分页面回发,但只有组合框被发送回服务器,并且只有部分被更新。事实上,这就是带有 signalR 的新西装外套页面的工作原理。

    所以试试上面的。您会注意到没有页面回发发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多