0

ListBoxファイル名のリストを含むWinFormプロジェクトを作成しました。ユーザーが送信ボタンをクリックすると、アプリケーションはPictureBoxファイルごとに1つのコントロールを動的にロードして表示し、処理されるまで待機します。それぞれに対してPDFファイルが生成されるためPictureBox、画像を表示するには、そのファイルの一致を更新する必要があります。

これが私がこれまでに持っているものです:

Private Sub ButtonSubmit_Click(sender As System.Object, e As System.EventArgs) Handles ButtonSubmit.Click

    Dim x As Integer = 790
    Dim y As Integer = 91
    For i As Integer = 0 To ListBox1.Items.Count - 1

        Dim key As String = ListBox1.Items(i).ToString()

        'adds picturebox for as many listbox items added
        Dim MyPictureBox As New PictureBox()
        MyPictureBox.Name = "pic" + key
        MyPictureBox.Location = New Point(x, y)
        MyPictureBox.Size = New Size(12, 12)
        MyPictureBox.SizeMode = PictureBoxSizeMode.StretchImage
        Me.Controls.Add(MyPictureBox)
        MyPictureBox.Image = My.Resources.Warning1
        ToolTipSpooling.SetToolTip(MyPictureBox, "Creating PDF...")
        x += 0
        y += 13

    Next i

    Call CheckPDFs()

End Sub

Public Sub CheckPDFs()
    Dim ListboxTicketIDs = (From i In ListBox1.Items).ToArray()

    For Each Item In ListboxTicketIDs
        Dim ID = Item.ToString

        Dim Watcher As New FileSystemWatcher()
        Watcher.Path = "C:\Temp\"
        Watcher.NotifyFilter = (NotifyFilters.Attributes)
        Watcher.Filter = ID + ".pdf"

        AddHandler Watcher.Changed, AddressOf OnChanged

        Watcher.EnableRaisingEvents = True
    Next

End Sub

Private Sub OnChanged(source As Object, e As FileSystemEventArgs)

    Dim p As PictureBox = CType(Me.Controls("pic" + ListBox1.Items.ToString()), PictureBox)
    p.Image = My.Resources.Ok1

End Sub

PictureBoxリストボックスにリストされているアイテムが表示された後、に基づいて、を別の画像に変更するのに問題がありFileSystemWatcherます。たとえば、ファイルは、に存在するのと同じ順序で作成されるとは限りませんListBox

編集

以下の作業コード。

Public Class Form1

Private WithEvents Watcher As FileSystemWatcher

Public Sub CheckPDFs()
    For i As Integer = 0 To ListBox1.Items.Count - 1
        Watcher = New FileSystemWatcher()
        Watcher.SynchronizingObject = Me
        Watcher.Path = "C:\Temp\"
        Watcher.NotifyFilter = NotifyFilters.Attributes
        Watcher.Filter = "*.pdf"

        Watcher.EnableRaisingEvents = True
    Next
End Sub

Private Sub Watcher_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs) Handles Watcher.Changed

    Dim key As String = Path.GetFileNameWithoutExtension(e.Name)
    Dim p As PictureBox = CType(Me.Controls("pic" + key), PictureBox)
    p.Image = My.Resources.Ok

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ListBox1.Items.Add(TextBox1.Text)
    TextBox1.Text = ""

    Dim x As Integer = 5
    Dim y As Integer = 5
    For i As Integer = 0 To ListBox1.Items.Count - 1

        Dim key As String = ListBox1.Items(i).ToString()

        'adds picturebox for as many listbox items added
        Dim MyPictureBox As New PictureBox()
        MyPictureBox.Name = "pic" + key
        MyPictureBox.Location = New Point(x, y)
        MyPictureBox.Size = New Size(15, 15)
        MyPictureBox.SizeMode = PictureBoxSizeMode.StretchImage
        Me.Controls.Add(MyPictureBox)
        MyPictureBox.Image = My.Resources.Info
        x += 0
        y += 18

    Next i

    Call CheckPDFs()
End Sub
4

1 に答える 1

1

まず第一に、複数のファイル ウォッチャーを作成する必要はありません。フォルダーへの変更を監視するために必要なのは、1 つのファイル ウォッチャーだけです。WithEventsイベント ハンドラーの追加と削除について心配する必要がないように、キーワードを使用してフォームの上部でプライベート フィールドとして宣言することをお勧めします。

次に、ウォッチャーが changed イベントを発生させると、イベント args オブジェクトのプロパティを調べることで、変更されたファイルのファイル名を取得できます。変更されたファイルの名前を取得し、そのファイル名をキーとして使用して、一致する画像ボックス コントロールを見つける必要があります。

Public Class Form1
    Private WithEvents Watcher As FileSystemWatcher

    Public Sub CheckPDFs()
        Watcher = New FileSystemWatcher()
        Watcher.Path = "C:\Temp\"
        Watcher.NotifyFilter = NotifyFilters.Attributes
        Watcher.Filter = "*.pdf"
    End Sub

    Private Sub Watcher_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs) Handles Watcher.Changed
        Dim key As String = Path.GetFileNameWithoutExtension(e.Name)
        Dim p As PictureBox = CType(Me.Controls("pic" + key), PictureBox)
        p.Image = My.Resources.Ok1
    End Sub
End Class

ただし、以下のコメントで、ファイル名はリストボックスのテキストと同じではなく、そのテキストで始まるだけだと言っているので、代わりに次のようにすることができます。

Private Sub Watcher_Changed(ByVal sender As Object, ByVal e As FileSystemEventArgs) Handles Watcher.Changed
    Dim p As PictureBox = Nothing
    For Each item As Object In ListBox1.Items
        If e.Name.StartsWith(item.ToString()) Then
            p = CType(Me.Controls("pic" + item.ToString()), PictureBox)
            Exit For
        End If
    Next
    If p IsNot Nothing Then
        p.Image = My.Resources.Ok1
    End If
End Sub
于 2012-09-17T21:00:53.040 に答える