我知道有一些关于从数据库动态填充下拉列表/依赖下拉列表的帖子和文章,但我的问题是独特的不同。
我有两个下拉列表: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" />
</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
1条答案
按热度按时间zaq34kh61#
所有的海报是要求设置级联组合框在反向顺序。
我的意思是,假设我们有一个级联的城市,然后我们从城市选择中选择一个酒店。
在第二种情况下,如DARN NEAR EVERY下拉菜单,我们有隐藏值(如PK值),然后我们有显示文本。
因此,让我们在City --〉hotel Name选择上设置一个级联。
所以,假设这个标记:
城市组合---〉酒店列表--选择酒店
所以,这个代码,相当常见。
因此,在页面加载-填写城市列表
用户选择城市,然后向下钻取到酒店。
我们现在看到、拥有、享受这一点:
好的,但是当然在我们做了这个级联之后,我会认为这个问题中的“明显先生”是如果我用这个选择加载reocrd会发生什么?
当然,我必须加载组合框,但我必须首先获得第二个级联值,并设置第一个组合,当然,然后设置城市,然后再次级联,然后选择用户选择的现有值。
该代码是“种”颠倒,但如果我们是聪明的,我们可以简单地重复使用第二级联代码后,我们设置的城市。
然后,在级联列表之外,我们当然根据保存的/先前的值设置第二个组合(假设来自一些CRUD编辑表单)。
所以,让我们这样做:
代码如下:
(基于给定的酒店ID)。
因此,我们实际上必须拉取Hotel reocrd,因为我们需要作为级联部分的City。我们不必重新加载第一个combo,而只需设置城市,然后调用第二个combo load(级联),然后基于该ID设置值。
我们由此得到/看到:
因此,您必须拉取第二个级联PK值,在本例中获得(城市),然后在第一个cbo中选择正确的值,调用第二个级联,然后设置第二个组合的pk id选择。