0

好的,以下代码显示了我如何在文本框中输入值、将该值添加到列表框、更新它旁边的图片框并将文本框清空,以便用户可以向列表框添加其他值。

    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
4

2 回答 2

3

查看FileSystemWatcher

于 2012-09-11T17:20:10.970 回答
1

循环时用户无法输入任何内容的原因是该WinForm框架本质上是单线程的。UI 中的所有内容都发生在同一个线程上,包括事件处理程序。因此,如果您在按钮单击事件处理程序中长时间处于循环中,那么 UI 将被锁定并且无响应,直到代码退出循环。解决这个问题的方法是启动一个新线程来执行任何需要完成的工作。该工作线程可能需要尽可能长的时间才能完成,并且不会干扰 UI 线程,因此 UI 保持响应。BackgroundWorker您可以在表单设计器中拖放到表单上的组件使这变得更容易。

但是,FileSystemWatcher正如 Dan-o 所推荐的那样,与创建自己的工作线程来不断检查文件是否存在相比,它可能是一个更好的解决方案。它不仅避免了重新发明轮子,而且效率更高。它不会不断地询问文件系统是否存在文件,它只是侦听来自文件系统的消息以了解何时发生更改。

于 2012-09-11T17:28:36.340 回答