好的,以下代码显示了我如何在文本框中输入值,将该值添加到列表框,更新旁边的图片框并消隐文本框,以便用户可以向列表框添加其他值。
ListBox1.Items.Add(TextBoxTicketID.Text)
If CStr(ListBox1.Items(0)) = TextBoxTicketID.Text Then
PictureBoxStatus1.Image = My.Resources.Orange_Information
End If
TextBoxTicketID.Text = ""
我还有另一个未在此处显示的流程,它将根据输入列表框的值创建PDF。
如果PDF存在与否,我在检查特定目录时遇到问题。当PDF存在时,我将图片框更改为另一个图像。
这是我正在使用的循环,但我遇到的问题是除非第一个值存在,否则用户无法输入第二个值。
Loop Until My.Computer.FileSystem.FileExists("c:\Temp\" + ListBox1.Items(0) + ".pdf")
PictureBoxStatus1.Image = My.Resources.Green_Checkmark
所以从理论上讲,我需要能够在列表框中输入X数量的值并继续检查文件是否存在,如果存在,则更改所需的图像。
修改
这是我最终做的......虽然似乎工作得很好......
ListBox1.Items.Add(TextBoxTicketID.Text)
If CStr(ListBox1.Items(0)) = TextBoxTicketID.Text Then
PictureBoxStatus1.Image = My.Resources.Orange_Information
End If
TextBoxTicketID.Text = ""
Call CheckFiles()
添加了公共子
Public Sub CheckSpooling()
Dim Watcher As New FileSystemWatcher()
Watcher.Path = "C:\Temp\"
Watcher.Filter = ListBox1.Items(0) + ".pdf"
AddHandler Watcher.Created, AddressOf OnChanged
Watcher.EnableRaisingEvents = True
End Sub
然后sub将运行添加文件所需的任何内容。我用msgbox进行测试。
Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)
' Specify what is done when a file is created.
MsgBox("File has been created!")
End Sub
答案 0 :(得分:4)
答案 1 :(得分:1)
用户在循环时无法输入任何内容的原因是因为WinForm
框架本质上是单线程的。 UI中的所有内容都发生在同一个线程上,包括事件处理程序。因此,如果您在按钮单击事件处理程序中长时间处于循环中,则UI将被锁定并且无响应,直到代码退出循环。解决这个问题的方法是启动一个新线程来执行需要完成的任何工作。该工作线程可以在需要完成时使用,并且不会干扰UI线程,因此UI保持响应。 BackgroundWorker
组件使您可以更轻松地将其放在表单设计器中的表单上。
但是,Dan-o推荐的FileSystemWatcher
可能是比创建自己的工作线程更好的解决方案,该线程会一直检查文件是否存在。它不仅避免重新发明轮子,而且还会更有效率。它不是一直询问文件系统文件是否存在,而是只是监听来自文件系统的消息,以找出发生变化的时间。