ASP.NET依赖DropDownList回显异常:ddlNumCheck无法默认选中提交值
依赖下拉框回显选中失败的修复方案
问题根源
ddlNumCheck回显时选不上值,主要是这几个原因:
- 回显顺序搞反了:先给ddlAssets赋值,但没先生成ddlNumCheck的选项,直接赋值的时候下拉框里根本没这个选项,当然选不上。
- 回显代码里字段取值全错了:SQL查出来的列是clientname、assetnumber这些,结果你全用
reader("Result"),这肯定取不到正确值。 - 后台赋值不会自动触发ddlAssets的
SelectedIndexChanged事件,所以ddlNumCheck的选项不会自动生成。
具体修复步骤
1. 把SQL查询和回显的字段对应上
原SQL没查a.AssetID,得加上,不然ddlAssets没法正确绑定值。然后回显时要对应正确的字段名:
- 文本框
clientname对应reader("clientname") - ddlAssets要绑AssetID,所以赋值
reader("AssetID") - ddlNumCheck对应数据库里的
assetnumber字段,赋值reader("assetnumber")
2. 调整回显流程:先造选项,再赋值
回显的时候,先给ddlAssets选中对应值,然后手动调用生成ddlNumCheck选项的逻辑,最后再给ddlNumCheck赋值,这样下拉框里有选项了才能选中。
3. 把生成ddlNumCheck选项的逻辑抽成独立方法
原来的逻辑全塞在SelectedIndexChanged里,回显时调用不方便,抽出来复用更省事。
修改后的代码示例
修正后的SQL语句
SELECT m.clientname, m.assetnumber, m.cost, m.purchaseDate, a.assets, a.AssetID FROM mainTable m INNER JOIN AssetsData a ON m.AssetID = a.AssetID WHERE m.ID = @someID
修正后的回显方法
Dim command As SqlCommand = New SqlCommand() Dim query As String = "SELECT m.clientname, m.assetnumber, m.cost, m.purchaseDate, a.assets, a.AssetID FROM mainTable m inner join AssetsData a on m.AssetID=a.AssetID where m.ID = @someID" command.Connection = connection command.Parameters.Add("@someID", SqlDbType.Int).Value = ID command.CommandText = query Dim reader As SqlDataReader = command.ExecuteReader() While reader.Read() ' 给文本框赋值 clientname.Text = reader("clientname").ToString() ' 先选中ddlAssets的对应值 ddlAssets.SelectedValue = reader("AssetID").ToString() ' 手动生成ddlNumCheck的选项 PopulateNumCheck(ddlAssets.SelectedValue) ' 最后给ddlNumCheck选中对应值 ddlNumCheck.SelectedValue = reader("assetnumber").ToString() End While connection.Close()
抽出来的PopulateNumCheck方法
Private Sub PopulateNumCheck(assetValue As String) Dim dt As DataTable = New DataTable() dt.Columns.Add("Assets", GetType(Integer)) dt.Columns.Add("AssetID", GetType(Integer)) If assetValue = "1" Then dt.Rows.Add(1, 1) ElseIf assetValue = "2" Then dt.Rows.Add(1, 1) dt.Rows.Add(2, 2) ElseIf Integer.Parse(assetValue) >= 3 Then dt.Rows.Add(1, 1) dt.Rows.Add(2, 2) dt.Rows.Add(3, 3) End If ddlNumCheck.DataSource = dt ddlNumCheck.DataTextField = "Assets" ddlNumCheck.DataValueField = "AssetID" ddlNumCheck.DataBind() ddlNumCheck.Items.Insert(0, New ListItem("--Select--", "")) End Sub
修改后的ddlAssets选中事件
Protected Sub ddlAssets_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) PopulateNumCheck(ddlAssets.SelectedValue) End Sub
额外提醒
- 要确保数据库里的
assetnumber字段值和ddlNumCheck的AssetID值是匹配的(比如都是1、2、3),不然就算有选项也选不上。 - 回显之前必须先调用
populateAssets方法把ddlAssets的选项初始化好,不然给ddlAssets赋值会无效。
内容的提问来源于stack exchange,提问作者Tairoc
相关产品推荐
相关产品推荐

