我目前正在编写实验室称重程序。 在我的表格上有一个42个位置的网格(7行6个样本= 1个机架),每个位置是一个按钮,名称为" Buttonxx" (其中xx代表位置编号,例如Button01,Button02,...,Button42)
所有信息都来自Oracle数据库,通过SQL。
我想根据SQL返回的一条信息更改特定按钮的Backcolor,即是否必须对该样本进行权衡(ToDo =" Y"或&#34 ; N")用于某个实验室分析(=" TitrType"代码中)
E.g。在下面的代码中,如果对于某个机架,只需要对TAN(= analysis / TitrType)的位置23(ToDo =" Y")进行权衡,那么只有该按钮的背景颜色(" Button23")应更改为LightSkyBlue
我从SQL中获取了正确的信息,并且能够将虚拟按钮的名称更改为ToDo的位置名称:DummyBtn.Name =" Button23"
但Backcolor因某种原因没有改变。
p.s。:我只是新手程序员,所以如果需要,请随时索取更多代码或信息。
Public Sub PrFillSampleGrid(TitrType As String, ByRef RS As System.Data.DataSet)
Dim Pos As Integer = 0
Dim TODO As String = ""
For x = 0 To RS.Tables("test").Rows.Count - 1
Pos = RS.Tables("test").Rows(x).Item("SERIESPOS")
TODO = RS.Tables("test").Rows(x).Item("TODO")
For y = 1 To 42
Dim DummyBtn As New Button
Select Case TODO.ToUpper
Case TODO = "YES", "Y"
If y = Pos Then
DummyBtn.Name = "Button" & y
Select Case TitrType
Case Is = "AcIn"
DummyBtn.BackColor = Color.Orange
Case Is = "TAN"
DummyBtn.BackColor = Color.LightSkyBlue
Case Is = "TBN"
DummyBtn.BackColor = Color.Crimson
Case Is = "TBN2"
DummyBtn.BackColor = Color.Yellow
End Select
End If
Case TODO = "NO", "N"
DummyBtn.BackColor = SystemColors.Control
End Select
Next y
Next x
End Sub
答案 0 :(得分:1)
尝试这样做:
Public Sub PrFillSampleGrid(TitrType As String, ByRef RS As System.Data.DataSet)
For x = 0 To RS.Tables("test").Rows.Count - 1
Dim Pos = CInt(RS.Tables("test").Rows(x).Item("SERIESPOS"))
Dim TODO = CStr(RS.Tables("test").Rows(x).Item("TODO"))
For y = 1 To 42
For Each DummyBtn In Me.Controls.Find("Button" & y.ToString(), True).OfType(Of Button)()
Select Case TODO.ToUpper
Case "YES", "Y"
If y = Pos Then
Select Case TitrType
Case Is = "AcIn"
DummyBtn.BackColor = Color.Orange
Case Is = "TAN"
DummyBtn.BackColor = Color.LightSkyBlue
Case Is = "TBN"
DummyBtn.BackColor = Color.Crimson
Case Is = "TBN2"
DummyBtn.BackColor = Color.Yellow
End Select
End If
Case "NO", "N"
DummyBtn.BackColor = SystemColors.Control
End Select
Next
Next y
Next x
End Sub
我所做的关键更改是For Each DummyBtn In Me.Controls.Find("Button" & y.ToString(), True).OfType(Of Button)()
行。这会在表单上搜索名为"Button" & y
的现有按钮,并将现有按钮分配给DummyBtn
。
我做的另一件事是将Option Strict On
放在代码的顶部。这立即突出显示了我修复的代码中的一堆其他错误。
建议始终使用Option Strict On
,因为它将VB置于严格的打字模式,并且将消除许多错误。您的行Case TODO = "YES", "Y"
是代码的示例,可能看起来是正确的,但事实并非如此。这是Case "True", "Y"
或Case "False", "Y"
与Option Strict Off
的评估。
答案 1 :(得分:0)
您的Select
/ Case
声明存在问题。您不需要Is =
,因为这意味着您拥有对象并且您正在测试相等性。您正在测试的值是String
(Value Type
},这是一个直接比较。
只需使用: -
Select Case TitrType
Case "AcIn"
DummyBtn.BackColor = Color.Orange
Case "TAN"
DummyBtn.BackColor = Color.LightSkyBlue
Case = "TBN"
DummyBtn.BackColor = Color.Crimson
Case = "TBN2"
DummyBtn.BackColor = Color.Yellow
End Select
答案 2 :(得分:0)
如果您使用按钮的类级别声明,则DummyBtn
永远不会与它们“连接”。
在分配BackColor
:
'Get a handle to the actual button
DummyBtn = CType(Me.ContainerName.Controls("Button" & y), Button)
将Dim DummyBtn As New Button
移到For y
循环之上并将其替换为: -
Dim DummyBtn As Button