連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第2回 コントロール配列がなくても大丈夫!

羽山 博
2006/09/23
Page1 Page2 Page3 Page4

■余談だけどとても重要 〜 コードを右端で折り返す

 ここで、少し脇道にそれよう。といっても重要な脇道なので、気を抜かずに進もう。

 図9のコード・エディタの画面を見ると、initProcの定義が長く、右端からはみだした部分は表示されていない。実はそこに今回の鍵となる重要な記述があるので、長い行が右端で折り返して表示されるように設定を変えてみよう。メモ帳やワープロの設定を変えるのと同じなので、難しくはない。

 メイン・メニューから[ツール]-[オプション]を選んで、[オプション]ダイアログを表示する。左側のツリーを開いて[テキスト エディタ Basic]−[エディタ]を選び、[右端で折り返す]をクリックしてオンにすれば設定終了(図11)。


図11 長い行を右端で折り返す設定
VB 2005 Express Editionではオプションの項目が少ないので、簡単に設定できる。Visual Studio 2005を使っている場合は、ほかのオプションが多数あるので、この設定項目が一覧の中に埋もれてしまって、ちょっと見つけにくい。

 コードを右端で折り返して表示し、さらに2件のデータを追加するコードを書いたのが図12だ。データを追加するためのコードは単純なので説明は不要だろう。ここでは、initProcの定義開始行の行末部分に注目してほしい。


図12 右端で行を折り返すように設定し、コードを追加
右端で折り返すと、はみだしていたコードがスクロールしなくても見えるようになった。データグリッドビューにデータを追加するコードは機械的に入力できるはず。initProcの定義開始行の行末部分に注目。

 initProcの定義の最後の部分は、

…… Handles MyBase.Load

となっている。これが、イベントとイベント・ハンドラを結び付けるための記述だ。

 MyBaseというのは「基本クラス」とでもいった意味だが、ここではフォームのこと。つまり、フォームのLoadイベントを取り扱う(Handleする)ということになる。こういう仕組みでイベント・ハンドラに好きな名前が付けられるようになっているわけだ。

■本筋に戻って 〜 イベント・ハンドラを共有する

 データグリッドビューに何件かのデータが入れられたので、このプログラムでやるべき以下の2つ事柄のうち、最初の方は一応の完成を見た。

  • フォームをロードしたときにデータグリッドビューにデータを入れる(こちらは完成)
  • ラジオボタンをクリックしたときに並べ替えを実行する(これから見ていく)

 残るは、ラジオボタンのイベント・ハンドラ。最後まで取っておいたおいしいところを心おきなく味わうことにしよう。

 ラジオボタンは2つあるのだが、VB 6のコントロール配列と同じように、1つのイベント・ハンドラで処理を実行したい。そこで、2つのラジオボタンを長方形で囲むようにドラッグして、まとめて選択しよう。コントロールがドラッグ操作で囲みにくい位置にあるなら、[Shift]キー+クリックや[Ctrl]キー+クリックで複数のコントロールを選択してもよい。

 コントロールが選択できたら、[プロパティ]ウィンドウを見てみよう。これまでと同じ状態であれば、イベントの一覧が表示されているはずだ。もし表示が変わっていたら前述したように[イベント]ボタンをクリックすればよい。ここでは、ClickイベントにdoSortというイベント・ハンドラ名を入力しよう(図13)。


図13 複数のコントロールに共通のイベント・ハンドラを指定する
複数のコントロールを選択し、イベント・ハンドラの名前を指定する。これで、複数のコントロールで同じイベント・ハンドラが呼び出されるようになる。この例ではイベント・ハンドラ名としてdoSortを指定したが、好きな名前を使ってよい。

 コード・エディタの[Form1.vb]タブをクリックすると、図14のようなイベント・ハンドラが追加されていることが分かる。


図14 追加されたイベント・ハンドラ
rbDateコントロールのClickイベントでも、rbCountコントロールのClickイベントでも、このdoSortというイベント・ハンドラが呼び出されるようになった。

 doSortの定義の行末部分に注目してみよう。

…… Handles rbDate.Click, rbCount.Click

とある。つまり、doSortプロシージャはrbDateコントロールのClickイベントと、rbCountコントロールのClickイベントを取り扱う(Handleする)ことになるわけだ。

 どうだろう。これまでの話がここにきて1本につながってきたのではないだろうか。どうやら、謎解きも終盤に差しかかってきた。頭の中の「?」が「!」に変わった人もいるだろう(ここ、ちょっと感動するところなんで、ムリにでも感動してください)。イベント・ハンドラの中では、どちらのコントロールがクリックされたのかを判定し、それに従って、データグリッドビュー・コントロールの行を並べ替えればよい。

 VB 6では、コントロール配列のどのコントロールでイベントが発生したかを知るには、インデックスを見ればよかった。VB 2005では、senderという引数でそれを知ることができる。senderには、イベントが発生した(イベントを送信した)コントロールが渡される。

 従ってClickイベント・ハンドラであるdoSortプロシージャに書くべきコードは、次のようになる(図15)。


図15 データグリッドビューの行を並べ替えるコード
Is演算子を使って、どのコントロールのイベントかを判定している。データグリッドビューの並べ替えにはSortメソッドが使える。Sortメソッドの引数には列を表すコントロール名と、昇順か降順かの区別を指定すればよい。併せて、[終了]ボタンのイベント・ハンドラも書いておいた。

 Is演算子を使えば、参照しているオブジェクト(コントロール)が同じものであるかどうかを調べることができるので、

If sender Is rbCount Then

とすれば「イベントの起こったコントロールがrbCountコントロールであれば」という意味になる。注意すべきことは、rbCountを引用符で囲まないこと。"rbCount"という文字列と等しいかどうかを調べるのではなく、コントロールと等しいかどうかを調べているからだ。

 並べ替えのためのコードは簡単。データグリッドビューであるdrvLogのSortメソッドを呼び出してやればよい。引数には列名と、昇順か降順を指定する。コードを見ると、いずれも並べ替えの順序として、

System.ComponentModel.ListSortDirection.Descending

が指定されているが、これは降順を表す。が、記述が長い。というか、長すぎる。さすがにこれを覚えるのはムリだろう。

 だが、ご心配なく。「.」(ピリオド)を入力した時点でインテリセンス(Intellisense)が働き、選択肢が表示される。上の呪文を長々と記述しなくても、実際には選択するだけでよい。ちなみに、昇順の場合、最後の部分が「Ascending」になる。

 では、[デバッグ開始]ボタンをクリックしてプログラムをコンパイル、実行してみよう。コードの記述に間違いがなければ、図16のようになる。


図16 完成したプログラムを実行する
プログラムを実行した後、[回数で並べ替え]をクリックした。アクセス回数の降順に行が並べ替えられている。列見出しに「▼」が表示されていることにも注目。

 このプログラムは、あくまでも勉強のためのプログラムなので、最低限の機能しか含まれていない。当然、不都合がいろいろとある。

 実は、データグリッドビューでは、コードを書かなくても列見出しをクリックすれば並べ替えができてしまう。エクスプローラの詳細表示で、名前順に並べ替えたり、サイズ順に並べ替えたりできるのと同じような感じだ。しかし例えば、[IPアドレス]という列の見出しをクリックして行を並べ替えてみると……残念なことに、いや、当然のことながら、ラジオボタンの状態は変わらない。[回数で並べ替え]がオンになったままだ。

 従って、列見出しをクリックして並べ替えを行った状態を、今度は逆にラジオボタンの状態にも反映してやる必要がある。これについては、データグリッドビューのSortイベントに対して以下のようなイベント・ハンドラを記述すればよい。

Private Sub onSorted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgvLog.Sorted
  If dgvLog.SortedColumn Is colCount Then
    rbCount.Checked = True
  ElseIf dgvLog.SortedColumn Is colDate Then
    rbDate.Checked = True
  Else
    rbCount.Checked = False
    rbDate.Checked = False
  End If
End Sub
リスト1 データグリッドビューのSortイベント・ハンドラ

 なお、例えば「回数」の列の現在の並べ替え順が昇順か降順かを知るには、

colCount.HeaderCell.SortGlyphDirection

の値を調べるとよい。0ならば並べ替えなし、1ならば昇順、2ならば降順となる。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第2回 コントロール配列がなくても大丈夫!
    1.サンプル・プログラム2 − XML文書を表示する
    2.データグリッドビューに列を追加する/イベント・ハンドラを書く
  3.本筋に戻って 〜 イベント・ハンドラを共有する
    4.デザートも豪華 〜 XML文書を読み込んで表示する
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH