【问题标题】:For loop with strings, arrays, and controls带有字符串、数组和控件的 for 循环
【发布时间】:2013-12-31 20:24:47
【问题描述】:

我想通了……

最后一件事:

如何编写代码以使“EFFICIENCY_STACKRANK_YTD(LblStckRnk1.Text) " 能用 i 改变值吗?

For i As Integer = 0 To 10
    EFFICIENCY_STACKRANK_YTD(LblStckRnk1.Text)
    StackPCT(i) = "StackPCT" + (1).ToString
    myArray(i) = Controls.Find(StackPCT(i), False)
    myControl(i) = myArray(i)(0)
    myControl(i).Text = RESULT1
Next

【问题讨论】:

  • 你能告诉我们你在做什么吗?
  • @Joseph.Scott.Garza 你在用什么? Winforms 还是 ASP.net Webforms?
  • @Plutonix,我只是想使用 for 循环编写更少的代码。
  • @Mike C,我正在使用 Windows 窗体应用程序。
  • 你在哪里分配 RESULT1

标签: arrays vb.net for-loop


【解决方案1】:

对于每个循环迭代,可以动态找到一个控件:

For i As Integer = 1 To 10    
    ' dynamically find a control using a fixed string plus a dynamic iteration counter.
    ' first iteration it will find LblStckRnk0
    ' second iteration it will find LblStckRnk1
    ' etc.
    ' beware of Controls that dont exist, or it will have a runtime error.
    EFFICIENCY_STACKRANK_YTD(DirectCast(Me.Controls.Find("LblStckRnk" & i, True).FirstOrDefault(), TextBox).Text)    
    ' removed remaining code.    
Next

【讨论】:

  • 当我输入该代码时,我收到一个错误:“对象引用未设置为对象的实例。”
  • 这从第 0 次迭代开始,您有 LblStckRnk0 还是从表单上的 1 开始?
  • 我从 LblStckRnk1 开始
  • 循环计数器从 0 开始到 10,执行 11 次迭代。你到底有多少个控件? (当我找到控制时,我现在将计数器增加 1)
  • 我有 LblStckRnk1 - LblStckRnk10
【解决方案2】:

没有真正的理由将控件存储在数组中。而不是从Controls()(表单控件集合??)复制引用,只需创建一个控件名称列表作为代表控件名称的List(of String)

Private ctlName As New List(of String)

For i As Integer = 0 To 10 
    ctlName.Add("StackPCT" & i.ToString
Next i

获取控件参考:

ctl = Controls(ctlName(IndexOfControlYouWant))
ctl.Text = RESULT1
' or

Controls(ctlName(Index)).Text = RESULT1

【讨论】:

    【解决方案3】:
    For Each lbl In Me.Controls.OfType(Of Label).Where(Function(l) l.Name Like "StackPCT#*")
        lbl.Text = RESULT1
    Next lbl
    

    更新:
    那个 sql 方法有一些 真的 不好的做法。这里有更好的:

    Private Function EFFICIENCY_STACKRANK_YTD(ByVal EMPLOYEE As String) As Integer
    
        Dim sql As String = _
            "SELECT CAST(SUM(TARGET_SECONDS) AS DECIMAL) / CAST(SUM(ROUTE_SECONDS) AS DECIMAL) RESULT1 " & _
            "FROM dbo.APE_BUSDRIVER_MAIN WITH(NOLOCK) " & _ 
            "WHERE APE_AREA_OBJID = @AreaObj AND EMPLOYEE_NAME= @Employee " & _
               " AND YEAR_TIME= @Year AND ACTIVE=1"
    
        Using cn As New SqlConnection(SQLConnectionStr), _
              cmd As New SqlCommand(sql, cn)
    
            cmd.Parameters.Add("@AreaObj", SqlDbType.Integer).Value = Integer.Parse(lblAreaOBJID.Text)
            cmd.Parameters.Add("@Employee", SqlDbType.NVarChar, 50).Value = EMPLOYEE
            cmd.Parameters.Add("@Year", SqlDbType.Integer).Value = Integer.Parse(cbYear.Text)
    
            cn.Open()
            Return DirectCast(cmd.ExecuteScalar(), Integer)
        End Using
    End Sub
    

    像这样使用它:

    Dim RESULT1 As Integer = EFFICIENCY_STACKRANK_YTD(EMPLOYEE)
    For Each lbl In Me.Controls.OfType(Of Label).Where(Function(l) l.Name Like "StackPCT#*")
        lbl.Text = RESULT1
    Next lbl
    

    【讨论】:

    • 我试过了,我的所有“StackPCTXX”标签都得到了“0”,除了 StackPCT10,它仍然 = 到“StackPCT10”
    • @Joseph.Scott.Garza 这是因为您没有正确检索 RESULT1 值。您在 sql 结果中查找 列索引,而不是值。
    猜你喜欢
    • 2013-11-02
    • 2022-01-26
    • 2013-11-08
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多