我尝试在GUI上使用listview来向用户提供反馈,告诉他们在漫长的过程中后面发生了什么。在该模块中,主过程中有四个子过程,列表视图中的最后一列显示它们的状态,如挂起、正在运行或已完成。因此,当子过程完成时,对应行上的子项应更新为“已完成”。
顺便说一下,我可以向列表视图添加项目(4行x 3列),在显示(表单加载)基本上是表单的GUI时不会出现任何问题。
在下面的脚本中,当我通过按钮单击事件调用该函数时,一切工作正常。然而,在模块中,消息框的结果为零,而列表视图中已经添加了四个项目。消息框后的行将显示以下错误:
“索引附加信息中出现'System.ArgumentOutOfRangeException‘类型的未处理异常:'0’的索引对‘System.Windows.Forms.dll’无效。”
它有什么问题?提前感谢!
Module Module1
Sub CreateReport()
Call SubProcedure1()
'Update listview
MessageBox.Show("There is/are: " & form6_ins.ListView1.Items.Count & " item(s)!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Call ListView_ScheduleUpdate1(0, 2, "Completed", 1, 2, "Running", ListView1) 'Throws Error
Call SubProcedure2()
'Update listview as well
Call SubProcedure3()
'Update listview as well
Call SubProcedure4()
'Update listview as well
End Sub
'Function to update the listview items
Public Function ListView_ScheduleUpdate1(ByVal itemNumX As Integer, ByVal subItemNumX As Integer, ByVal givenFeedbackX As String,
ByVal itemNumY As Integer, ByVal subItemNumY As Integer, ByVal givenFeedbackY As String, ByRef LV As ListView)
LV.Items(itemNumX).SubItems(subItemNumX).Text = givenFeedbackX
LV.Items(itemNumY).SubItems(subItemNumY).Text = givenFeedbackY
LV.Refresh()
End Function
End Module
'Form
Public Class Form1
Private Sub But_Report_DSchedule_Click(sender As Object, e As EventArgs) Handles But_Report_DSchedule.Click
MessageBox.Show("There is/are: " & ListView1.Items.Count & " item(s)!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Call ListView_ScheduleUpdate1(0, 2, "Completed", 1, 2, "Running", ListView1)
End Sub
End Class发布于 2016-04-01 01:50:39
如果在加载窗体之前调用Sub Main,则ListView实际上并不存在。在窗体加载之前,不应尝试访问窗体上的控件的属性。出自“硬核Visual Basic”一书:
加载窗体时,事件的顺序如下:
窗体是一个类,并且所有类都有一个Initialize事件。只要您接触到窗体的任何变量或属性,就会立即调用(或触发,正如控件开发人员所描述的调用事件) Form_Initialize。使用此事件初始化窗体专用的变量。通常,您不应在此处触摸任何窗体或控件属性,因为这样做会触发下一个事件。
在创建表单的可视元素并将默认值分配给属性时,在Form_Initialize之后触发Form_Load。通常,您应该避免执行任何会在窗体上绘制内容的操作,因为这会导致自动触发下一个事件。在Form_Load中调用Show,然后对可见表单进行进一步处理可能很诱人,但通常最好在下一个事件中执行此操作。
Form_Activate会在您加载并显示表单后触发。可以在不显示表单的情况下加载表单;在这种情况下,直到调用Show方法时才会触发Form_Activate。当您从一个无模式窗体切换到另一个无模式窗体时,或者当您在Form_Activate窗体之间切换时(但不是当您从另一个应用程序返回焦点时),也会调用该函数。如果您的应用程序具有无模式表单或MDI表单,请不要在Form_Activate中执行您希望只发生一次的任何操作。或者使用静态变量(例如fNotFirst)来防止Form_Activate中的多次初始化。这三个初始化事件之间的交互可能会令人困惑。有时,反复试验是为您的应用程序找出正确初始化序列的唯一方法。
https://stackoverflow.com/questions/36339183
复制相似问题