VB.Net中批量修改Image.Url的冗余代码优化方案咨询
一、前端代码优化:用Repeater动态生成按钮
无需手动编写30个重复的ImageButton标签,利用ASP.NET的Repeater控件循环生成,彻底消除冗余代码:
<asp:Repeater ID="rptBoxButtons" runat="server" OnItemCommand="rptBoxButtons_ItemCommand"> <ItemTemplate> <asp:ImageButton ID="boxBtn" alt="Add To Watch List" runat="server" CommandArgument='<%# Eval("BoxNo") %>' CommandName="SelectBox" CssClass="BoxPriceMenu" ImageUrl='<%# "~/files/images/icons/boxesFooty/box" + Eval("BoxNo") + ".gif" %>' /> <%# (Container.ItemIndex + 1) % 5 == 0 ? "<br />" : "" %> <!-- 保持原布局,每5个按钮换行 --> </ItemTemplate> </asp:Repeater>
二、后端VB.Net代码优化
1. 页面加载时绑定数据并设置选中状态
先生成1-30的按钮数据源绑定到Repeater,再从数据库读取用户选中的boxNo,动态匹配并修改对应按钮的图片路径:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ' 生成1到30的按钮编号数据源 Dim boxNumbers As New List(Of Integer)() For i As Integer = 1 To 30 boxNumbers.Add(i) Next rptBoxButtons.DataSource = boxNumbers rptBoxButtons.DataBind() ' 从数据库读取并设置用户选中的按钮状态 SetSelectedBox() End If End Sub Private Sub SetSelectedBox() Dim acc As New accounts(Membership.GetUser.ProviderUserKey) Dim selectedBoxNo As String = String.Empty Dim DBConnect91 As New DBConn Using db As DbConnection = DBConnect91.Conn("DBConnectionString") Dim cmd As SqlCommand = DBConnect91.Command(db, "SelectEntrants") cmd.Parameters.Add(New SqlParameter("fileID", SqlDbType.Int)).Value = Request.QueryString("oid") db.Open() Dim DR As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) If DR.Read Then ' 仅匹配当前用户的记录 If DR("accountID").ToString() = acc.accountID.ToString() Then selectedBoxNo = DR("boxNo").ToString() End If End If DR.Close() End Using ' 找到对应按钮并替换为选中状态图片 If Not String.IsNullOrEmpty(selectedBoxNo) Then For Each item As RepeaterItem In rptBoxButtons.Items Dim btn As ImageButton = CType(item.FindControl("boxBtn"), ImageButton) If btn.CommandArgument = selectedBoxNo Then btn.ImageUrl = $"~/files/images/icons/boxesFooty/selectedbox{selectedBoxNo}.gif" Exit For End If Next End If End Sub
2. 统一处理按钮点击事件
用Repeater的ItemCommand事件替代原有的单个点击事件,统一处理所有按钮的提交逻辑:
Protected Sub rptBoxButtons_ItemCommand(ByVal source As Object, ByVal e As RepeaterCommandEventArgs) If e.CommandName = "SelectBox" Then Dim boxNo As Integer = Integer.Parse(e.CommandArgument.ToString()) Dim acc As New accounts(Membership.GetUser.ProviderUserKey) Dim DBConnect As New DBConn Using db As DbConnection = DBConnect.Conn("DBConnectionString") Dim cmd As SqlCommand = DBConnect.Command(db, "addEntrant") cmd.Parameters.Add(New SqlParameter("accountID", SqlDbType.UniqueIdentifier)).Value = acc.accountID cmd.Parameters.Add(New SqlParameter("fileID", SqlDbType.Int)).Value = Request.QueryString("oid") cmd.Parameters.Add(New SqlParameter("boxNo", SqlDbType.Int)).Value = boxNo db.Open() cmd.ExecuteNonQuery() End Using ' 提交后刷新选中状态 SetSelectedBox() End If End Sub
三、额外优化建议
- 定义图片路径常量:
Const IMAGE_BASE_PATH As String = "~/files/images/icons/boxesFooty/",后续修改路径只需调整常量值。 - 封装数据库通用操作:将连接创建、命令执行等重复代码抽成独立方法,减少代码冗余。
内容的提问来源于stack exchange,提问作者mark davies
相关产品推荐
相关产品推荐

