如何根据ddlNumCheck默认值显示对应Repeater动态生成行?
解决ASP.NET中根据下拉框默认值动态生成Repeater行的问题
现有代码的问题分析
- 加载数据方法存在逻辑错误:
- 循环
DynamicRepeater.Items无意义,此时Repeater未绑定数据,集合为空 - 多次使用
reader("Result"),但SQL查询中无此字段,属于字段名错误 ddlAssets(Nothing,Nothing)是无效语法调用- 变量名混乱,
command和cmdSQL混用
- 循环
ddlNumber_SelectedIndexChanged方法逻辑冗余:- 执行SQL查询但未使用结果,最终仍用空
ItemsModel集合绑定 - 变量名不一致,同时出现
ddlNumber和ddlNumCheck,导致取值错误
- 执行SQL查询但未使用结果,最终仍用空
- 页面加载完成后,未根据
ddlNumCheck的默认选中值触发Repeater绑定逻辑
修正后的解决方案
- 重构加载数据方法,正确填充表单字段
- 提取Repeater绑定逻辑为独立方法,方便页面加载和下拉框变化时复用
- 加载数据完成后,调用绑定方法根据
ddlNumCheck的值生成对应行数
修正后的后台代码
' 加载数据的方法 Protected Sub LoadRecord(ByVal ID As Integer) Dim connectionString As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString Using connection As New SqlConnection(connectionString) Dim query As String = "SELECT m.clientname, m.assetnumber, m.cost, m.purchaseDate, a.assets, m.WaterSize, m.NumCheckValue FROM mainTable m INNER JOIN AssetsData a ON m.AssetID = a.AssetID WHERE m.ID = @someID" Using command As New SqlCommand(query, connection) command.Parameters.Add("@someID", SqlDbType.Int).Value = ID connection.Open() Dim reader As SqlDataReader = command.ExecuteReader() If reader.Read() Then ' 填充表单字段 clientname.Text = reader("clientname").ToString() ddlAssets.SelectedValue = reader("assets").ToString() ' 触发ddlAssets的选择事件,确保ddlNumCheck正确填充 ddlAssets_SelectedIndexChanged(ddlAssets, New EventArgs()) ' 设置ddlNumCheck的默认值 ddlNumCheck.SelectedValue = reader("NumCheckValue").ToString() ' 根据ddlNumCheck的值绑定Repeater BindRepeaterByNumCheck() End If reader.Close() End Using End Using End Sub ' 独立的Repeater绑定方法 Protected Sub BindRepeaterByNumCheck() Dim rows As Integer = 0 Integer.TryParse(ddlNumCheck.SelectedValue, rows) ' 限制最大行数为3,符合业务规则 rows = Math.Min(rows, 3) Dim items As New List(Of ItemsModel)() For i As Integer = 0 To rows - 1 items.Add(New ItemsModel()) Next DynamicRepeater.DataSource = items DynamicRepeater.DataBind() End Sub ' ddlNumCheck的选择变化事件 Protected Sub ddlNumCheck_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) BindRepeaterByNumCheck() End Sub ' 页面加载时调用(编辑页面在IsPostBack为False时加载数据) Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load If Not IsPostBack Then ' 假设ID从URL获取 Dim recordID As Integer = Integer.Parse(Request.QueryString("ID")) LoadRecord(recordID) End If End Sub
前端Repeater代码修正(移除多余属性)
<asp:Repeater ID="DynamicRepeater" runat="server" OnItemDataBound="DynamicRepeater_ItemDataBound"> <HeaderTemplate> <table border="1"> <tr> <td><b>Water Size</b></td> <td><b>Cost</b></td> <td><b>Purchase Date</b></td> </tr> </table> </HeaderTemplate> <ItemTemplate> <tr> <td> <asp:DropDownList ID="ddlWater" AppendDataBoundItems="true" runat="server"> <asp:ListItem Text="Select" Value="" Selected="True" /> </asp:DropDownList> </td> <td> <asp:TextBox ID="cost" runat="server"></asp:TextBox> </td> <td> <asp:TextBox ID="PurchaseDate" runat="server"></asp:TextBox> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater><br />
关键说明
- 确保
mainTable中存储了ddlNumCheck的选中值(字段名NumCheckValue需根据实际表结构调整) - 调用
ddlAssets_SelectedIndexChanged是为了保证ddlNumCheck能根据ddlAssets的选中值正确填充选项,避免设置默认值时出现选项不存在的情况 BindRepeaterByNumCheck方法限制最大行数为3,符合业务规则中选择3及以上时显示3行的要求
内容的提问来源于stack exchange,提问作者Tairoc
相关产品推荐
相关产品推荐

