VB.NET覚書

VB.NETの覚書
[個人メモ] [仕事メモ] [アイデア] [Ruby]
[TIPS] [対応表] [コメント書き方] [.NET Tips] [VB中学校] [VB.NET の入門サイト] [VB.NET コーディング標準 ] [VBレスキュー] [NonSoft]

2015-04-08

backGroundWorker

時間のかかる処理をバックグラウンドで実行する

http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html



http://www.atmarkit.co.jp/fdotnet/dotnettips/437bgwcancel/bgwcancel.html

Imports System.ComponentModel

Public Class Form1

  ' [スタート]ボタンのイベント・ハンドラ
  Private Sub buttonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonStart.Click
    buttonStart.Enabled = False
    buttonCancel.Enabled = True

    ' 時間のかかる処理を別スレッドで開始
    bgWorker.RunWorkerAsync(100)
    ' DoWorkイベント発生
  End Sub

  ' [キャンセル]ボタンのイベント・ハンドラ
  Private Sub buttonCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonCancel.Click
    ' 時間のかかる処理のキャンセル
    bgWorker.CancelAsync()
  End Sub

  ' 時間のかかる処理を行うメソッド
  Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
    ' 別スレッドで実行されるため、このメソッドでは
    ' UI(コントロール)を操作してはいけない

    ' このメソッドへのパラメータ
    Dim bgWorkerArg As Integer = CType(e.Argument, Integer)

    ' senderの値はbgWorkerの値と同じ
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

    ' 時間のかかる処理
    For i As Integer = 1 To bgWorkerArg

      ' キャンセルされてないか定期的にチェック
      If worker.CancellationPending Then
        e.Cancel = True
        Return
      End If

      System.Threading.Thread.Sleep(100)

      Dim percentage As Integer = i * 100 / bgWorkerArg ' 進ちょく率
      worker.ReportProgress(percentage)
      ' ProgressChangedイベント発生
    Next

    ' このメソッドからの戻り値
    e.Result = "すべて完了"

    ' この後、RunWorkerCompletedイベントが発生

  End Sub

  Private Sub bgWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
    ' 進ちょく状況の表示
    Me.Text = e.ProgressPercentage & "%完了"
    progressBar.Value = e.ProgressPercentage
  End Sub

  Private Sub bgWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
    If e.Cancelled Then
      MessageBox.Show("キャンセルされました")
      ' この場合にはe.Resultにはアクセスできない
    Else
      ' 処理結果の表示
      Me.Text = e.Result.ToString()
      MessageBox.Show("正常に完了")
    End If

    buttonStart.Enabled = True
    buttonCancel.Enabled = False
  End Sub
End Class

checedkListBox

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.CheckedListBox1.Items.Add("List1", True)
        Me.CheckedListBox1.Items.Add("List2")
        Me.CheckedListBox1.Items.Add("List3")
        Me.CheckedListBox1.Items.Add("List4")
        Me.CheckedListBox1.Items.Add("List5")
        Me.CheckedListBox1.Items.Add("List6")

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If Me.CheckedListBox1.GetItemChecked(0) = True Then
            MessageBox.Show("Item0 checked")
        Else
            MessageBox.Show("Item0 not checked")
        End If
    End Sub
End Class

errorProvider

エラーを表示する

Public Class Form1

    Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave
        'チェックする項目
        If IsNumeric(TextBox1.Text) Or _
         TextBox1.Text = "" Then
            'エラープロバイダーをクリア
            ErrorProvider1.SetError(TextBox1, Nothing)
        Else
            'エラープロバイダーにセット
            ErrorProvider1.SetError(TextBox1, _
            "数値で書くんだよ!")
        End If
    End Sub

End Class
トラックバック - http://sub.g.hatena.ne.jp/garyo/20150408