asp.net 如何从数据库填充依赖下拉列表?

hgb9j2n6  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(200)

我知道有一些关于从数据库动态填充下拉列表/依赖下拉列表的帖子和文章,但我的问题是独特的不同。
我有两个下拉列表:ddlAssets和ddlNumCheck
ddlNumCheck是ddlAssets下拉列表的从属下拉列表。
例如,假设ddlAssets有4个值(1,2,3,4),根据业务需求,如果您从中选择1,则1将添加到ddlNumCheck下拉列表中。
如果选择2,则2(1,2)将添加到ddlNumCheck下拉列表中。
最后,将3及以上的任何值3(1,2,3)添加到ddlNumCheck下拉列表中。3是可从ddlAssets添加到ddlNumCheck的最大值。
最后,根据您从ddlNumCheck中选择的值,将自动创建一个具有三个列名的行。
如果从ddlNumCheck中选择2,则会自动创建2行及其列名。
如果从ddlNumCheck中选择3,则会自动创建3行及其列名。
然后您可以填写这些列并提交到数据库。
这整个场景工作得很好。我从网上狼吞虎咽地吃了一部分,当从其中选择一个值时,ddlNumCheck dropdownlist动态地创建行。
我现在遇到的问题是,当尝试查询DB以检索我刚才如上所述提交的数据时,我们希望看到两个下拉列表的值都是默认选中的。
例如,如果我从ddlAssets下拉列表中选择了4,从ddlNumCheck下拉列表中选择了2,然后我成功地将它们提交到数据库,当我查询数据库以加载此数据并在表单上显示它们时,我们希望4成为ddlAsets下拉列表的默认选定值,希望2成为ddlNumCheck下拉列表的默认选定值。
到目前为止,当我运行下面的代码时,包括ddlAssets dropdownlist在内的所有表单字段都会显示它们的值,并且ddlAssets会默认选择它的值。ddlNumCheck dropdownlist不会显示它的值。
我哪里做错了?
下面是一些相关的代码片段。

Dim command As SqlCommand = New SqlCommand()
        Dim query As String = "SELECT m.clientname,m.assetnumber,m.cost,m.purchaseDate,a.assets FROM mainTable m inner join AssetsData a on m.AssetID=a.AssetID where m.ID =" @someID
        command.Connection = connection
        cmdSQL.Parameters.Add("@someID", SqlDbType.Int).Value = ID
        command.CommandText = query
        Dim reader As SqlDataReader = command.ExecuteReader()
                 
        While reader.Read()
            clientname.Text = reader("Result").ToString()
            ddlAssets.Text = reader("Result").ToString()
            ddlNumCheck.Text = reader("Result").ToString()
        End While
    
        connection.Close()
    End Sub

    <tr>
        <td width="(100/2)%">Total # of assets at property:</td>
        <td>
            <asp:DropDownList ID="ddlAssets" CssClass="ChangeWidth" runat="server" OnSelectedIndexChanged="ddlAssets_SelectedIndexChanged" AutoPostBack="true" />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
        <td>How many assets did you upgrade?
            <asp:DropDownList ID="ddlNumCheck" CssClass="ChangeWidth" runat="server" OnSelectedIndexChanged="ddlNumCheck_SelectedIndexChanged" AutoPostBack="true" />
        </td>
    </tr>

    Private Sub populateAssets()
        Dim con As SqlConnection = New SqlConnection(constring)
        Dim com As String = "Select * from AssetsTable"
        Dim adpt As SqlDataAdapter = New SqlDataAdapter(com, con)
        Dim dt As DataTable = New DataTable()
        adpt.Fill(dt)
        ddlAssets.DataSource = dt
        ddlAssets.DataBind()
        ddlAssets.DataTextField = "Assets"
        ddlAssets.DataValueField = "AssetID"
        ddlAssets.DataBind()
        ddlAssets.Items.Insert(0, New ListItem("--Select--", ""))
    End Sub
     
Protected Sub ddlAssets_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim dt As DataTable = New DataTable()
    dt.Columns.Add("Assets", GetType(Integer))
    dt.Columns.Add("AssetID", GetType(Integer))
    If ddlAssets.SelectedValue = "1" Then
        dt.Rows.Add("1", "1")
        ddlNumCheck.DataSource = dt
        ddlNumCheck.DataTextField = "Assets"
        ddlNumCheck.DataValueField = "AssetID"
        ddlNumCheck.DataBind()
        ddlNumCheck.Items.Insert(0, New ListItem("--Select--", ""))
    ElseIf ddlAssets.SelectedValue = "2" Then
        dt.Rows.Add("1", "1")
        dt.Rows.Add("2", "2")
        ddlNumCheck.DataSource = dt
        ddlNumCheck.DataTextField = "Assets"
        ddlNumCheck.DataValueField = "AssetID"
        ddlNumCheck.DataBind()
        ddlNumCheck.Items.Insert(0, New ListItem("--Select--", ""))
    ElseIf Integer.Parse(ddlAssets.SelectedValue) >= Integer.Parse("3") Then
        dt.Rows.Add("1", "1")
        dt.Rows.Add("2", "2")
        dt.Rows.Add("3", "3")
        ddlNumCheck.DataSource = dt
        ddlNumCheck.DataTextField = "Assets"
        ddlNumCheck.DataValueField = "AssetID"
        ddlNumCheck.DataBind()
        ddlNumCheck.Items.Insert(0, New ListItem("--Select--", ""))
    End If
End Sub
zaq34kh6

zaq34kh61#

所有的海报是要求设置级联组合框在反向顺序。
我的意思是,假设我们有一个级联的城市,然后我们从城市选择中选择一个酒店。
在第二种情况下,如DARN NEAR EVERY下拉菜单,我们有隐藏值(如PK值),然后我们有显示文本。
因此,让我们在City --〉hotel Name选择上设置一个级联。
所以,假设这个标记:

<div style="padding:25px">
<div style="float:left">
    <h3>Select City</h3>
    <asp:DropDownList ID="cboCity" runat="server" Width="168px"
        DataValueField="City" 
        DataTextField="City" AutoPostBack="true"
        OnSelectedIndexChanged="cboCity_SelectedIndexChanged" >
    </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"
        AutoPostBack="true"
        OnSelectedIndexChanged="cboHotels_SelectedIndexChanged">
    </asp:DropDownList>
</div>

<div style="float:left;margin-left:25px">
    <div style="text-align:right">
        Hotel Pick (id) = <asp:TextBox ID="txtHotelID" runat="server"></asp:TextBox> <br />
        Hotel Name = <asp:TextBox ID="txtHotelName" runat="server" Width="240px"></asp:TextBox> <br />
    Enter new Hotel id (go backwards) <asp:TextBox ID="txtNewID" runat="server"></asp:TextBox> <br />
    <asp:Button ID="cmdBackWards" runat="server" Text="setup combo's (go backwards)" CssClass="btn"
        OnClick="cmdBackWards_Click" />
    </div>
</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
        LoadCityCbo

    End If

End Sub

Sub LoadCityCbo()
    Dim cmdSQL As New SqlCommand("SELECT City from City ORDER BY City")
    cboCity.DataSource = MyrstP(cmdSQL)
    cboCity.DataBind()
    cboCity.Items.Insert(0, New ListItem("Select City", "")) ' Add blank row selecting
End Sub

Sub LoadHotelCbo()

    Dim strSQL As String =
            "Select ID, HotelName FROM tblHotels 
             WHERE City = @City ORDER BY HotelName"

    Dim cmdSQL As New SqlCommand(strSQL)
    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 Sub

Protected Sub cboCity_SelectedIndexChanged(sender As Object, e As EventArgs)

    ' cascade City and limit hotels from given city.
    If cboCity.SelectedIndex > 0 Then

        LoadHotelCbo()

    End If

End Sub

Protected Sub cboHotels_SelectedIndexChanged(sender As Object, e As EventArgs)

    If cboHotels.SelectedIndex > 0 Then
        txtHotelID.Text = cboHotels.SelectedItem.Value
        txtHotelName.Text = cboHotels.SelectedItem.Text
    End If
End Sub

因此,在页面加载-填写城市列表
用户选择城市,然后向下钻取到酒店。
我们现在看到、拥有、享受这一点:

好的,但是当然在我们做了这个级联之后,我会认为这个问题中的“明显先生”是如果我用这个选择加载reocrd会发生什么?
当然,我必须加载组合框,但我必须首先获得第二个级联值,并设置第一个组合,当然,然后设置城市,然后再次级联,然后选择用户选择的现有值。
该代码是“种”颠倒,但如果我们是聪明的,我们可以简单地重复使用第二级联代码后,我们设置的城市。
然后,在级联列表之外,我们当然根据保存的/先前的值设置第二个组合(假设来自一些CRUD编辑表单)。
所以,让我们这样做:
代码如下:
(基于给定的酒店ID)。

Protected Sub cmdBackWards_Click(sender As Object, e As EventArgs)

    Dim strSQL As String = "SELECT * FROM tblHotels WHERE ID = @ID"
    Dim cmdSQL As New SqlCommand(strSQL)
    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = txtNewID.Text
    Dim rstHotels As DataTable = MyrstP(cmdSQL)
    Dim sCity As String = rstHotels.Rows(0).Item("City")

    ' select correct city for cbo combo
    cboCity.Text = sCity
    LoadHotelCbo()
    cboHotels.Text = txtNewID.Text

End Sub

因此,我们实际上必须拉取Hotel reocrd,因为我们需要作为级联部分的City。我们不必重新加载第一个combo,而只需设置城市,然后调用第二个combo load(级联),然后基于该ID设置值。
我们由此得到/看到:

因此,您必须拉取第二个级联PK值,在本例中获得(城市),然后在第一个cbo中选择正确的值,调用第二个级联,然后设置第二个组合的pk id选择。

相关问题