首先......如果我开始时做错了,我会以不同的方式给这只猫上皮。使用VB 2010 .net 4.0,我是一个非常初学者。
我正在制作一个产品结算应用程序,其中包含一个主窗体和一个带有其他选项的子窗体。只要在打开一次后重新打开该子表单,默认情况下所选的复选框事件为空。如果我重新检查它们(所以有人可以取消选中),那么任何重新检查的都会重新启动并再次增加变量。
我最终需要能够在关闭它之后打开第二个表单,显示之前选中的任何复选框,再次选中,而不是在此过程中增加变量。
主窗体复选框代码,用于设置布尔值并增加或减少大多数使用过的产品的小计变量。
Private Sub chkbox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkbox1.CheckedChanged
If chkbox1.Checked = True Then
bChkbox1 = True
Subtotal += 15
Else
bChkbox1 = False
Subtotal -= 15
End If
End Sub
主窗体按钮,用于启动子窗体,列出所有产品。
Private Sub btnAllProducts_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAllProducts.Click
Form3.Show()
End Sub
子窗体复选框代码在第一次打开时完美运行,但在重新启动时无法正常工作。
Private Sub chkbox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkbox2.CheckedChanged
If chkbox2.Checked = True Then 'also tried without the nested if with same results
If Me.IsHandleCreated = True Then 'me.visible behaves the same way
MsgBox("form visible true")'launches after clicking button but before form is actually on screen
Form1.bcheckbox2 = True
Form1.Subtotal += 105
End If
Else
Form1.bcheckbox2 = False
Form1.Subtotal -= 105
End If
End Sub
布尔值用于复选在主页面上检查过的框或之前打开的框。
If Form1.bcheckbox2 = True Then
chkbox2.Checked = True
End If
正如我所说,如果有意义的话,我可以完全修改代码,或者如果我犯了某种错误就修改了一些代码。
例如,我正在考虑更改为擦除每个表单加载上的小计并根据切换的布尔值重建它,但似乎应该有一个更优雅的方式,更少的开销,我只是做错了什么。
答案 0 :(得分:2)
在加载表单时,必须告知检查和无线电以忽略事件。你只需要一个Ignore或Loaded标志:
Public Class Form1
Private ignore As Boolean = True
...
Private Sub Form1_Load(...
' do normal stuff
ignore = False ' should be the ONLY place it is set
End Sub
Private Sub CheckBox2_CheckedChanged(...
If ignore Then Exit Sub
End Sub
表单设计器代码将在创建表单和控件时触发事件,这对于初始化内容非常方便,但通常会导致问题。有些控件甚至可以两次获得相同的事件。表单上没有真正的“重新加载”操作。如果隐藏它们,Show()
将不会再次触发Load事件。
当表单加载时,您可以避免使用该标志并手动添加处理程序以处理麻烦的控件,但如果有很多这样的话,这可能会很乏味。标志可以被滥用和误用,但如果它只设置在那个位置,那就好了。
答案 1 :(得分:0)
如果有人正在寻找替代品或有类似问题,这是我检测事件变化的解决方法,因此重新加载时不会触发复选框:
If ((Me.CheckBox2.Value <> Sheets(1).Range("t6").Value) And (Me.CheckBox2 = True)) = True Then
' do your stuff
Me.CheckBox2.Value = False
Else
Me.CheckBox2.Value = True
End If
Sheets(1).Range("t6").Value
的值存储在checkbox2
的位置。
我已将此分配给msgbox输入,以便在触发vbno事件时执行其他操作。
干杯。