【VB.NET】DataGridViewの限界を突破せよ!「カスタムセル」自作で実現する究極の業務UI
こんにちは。現場の最前線でコードを書き続けてきたエンジニアです。
皆さんが普段使っている`DataGridView`、便利ですよね。でも、業務システムを構築していると、「ここにカレンダーをポンと出したい」「バーコードリーダーの入力を即座にフックして別処理に飛ばしたい」といった、標準機能では手が届かないニッチな要件にぶつかるはずです。
「既存のコントロールで我慢する」のは、もう終わりです。今日は、VB.NETのオブジェクト指向の神髄に触れつつ、`DataGridView`をあなたの手足のように操る「カスタム列(DataGridViewColumn)開発」の極意を伝授します。
—
1. なぜ「カスタムセル」を作るのか?
標準の`DataGridViewTextBoxColumn`などは、あくまで「汎用」です。これらを無理やり改造しようとすると、`CellFormatting`イベントで無理な描画を行ったり、見えない場所に`TextBox`を配置したりと、コードがスパゲッティ化します。
カスタムセルの真の目的は、「データ」と「UIの振る舞い」をクラスとしてカプセル化することにあります。
一度作ってしまえば、どんな画面でも「貼るだけ」で機能が完成する。これが真のエンジニアリングです。
—
2. 実装の設計図:3つのクラスを理解する
カスタム列を作るには、VB.NETで以下の3つのクラスを継承して連動させる必要があります。
1. DataGridViewColumn: グリッドの列そのものの設定(ヘッダー名など)。
2. DataGridViewCell: セルの中身(値の保持や描画)。
3. DataGridViewEditingControl: セルが「編集モード」になった時に現れる実体(TextBoxなど)。
これらは、いわば「列という器」「セルという場所」「編集という機能」の関係です。
—
3. 実践:独自の「入力支援ボタン付きセル」を作る
まずは、セル内に「ポップアップ呼び出し用のボタン」を表示するカスタムセルを例に実装を見ていきましょう。
手順①:セルの中身を作る(Cellクラス)
`DataGridViewTextBoxCell`を継承して、描画をカスタマイズします。
Public Class MyCustomCell
Inherits DataGridViewTextBoxCell
‘ セルの描画処理をオーバーライド
Protected Overrides Sub Paint(graphics As Graphics, clipBounds As Rectangle, cellBounds As Rectangle, rowIndex As Integer, cellState As DataGridViewElementStates, value As Object, formattedValue As Object, errorText As String, cellStyle As DataGridViewCellStyle, advancedBorderStyle As DataGridViewAdvancedBorderStyle, paintParts As DataGridViewPaintParts)
‘ 基本的な描画を実行
MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)
‘ 右端に「…」ボタンのような四角形を描画する
Dim buttonRect As New Rectangle(cellBounds.Right – 20, cellBounds.Top + 2, 18, cellBounds.Height – 4)
ControlPaint.DrawButton(graphics, buttonRect, ButtonState.Normal)
graphics.DrawString(“…”, cellStyle.Font, Brushes.Black, buttonRect.X + 3, buttonRect.Y + 2)
End Sub
End Class
手順②:列を定義する(Columnクラス)
このセルを格納する「列」を定義します。
Public Class MyCustomColumn
Inherits DataGridViewColumn
Public Sub New()
‘ この列が使うセルを初期化
MyBase.CellTemplate = New MyCustomCell()
End Sub
End Class
—
4. 陥りやすい罠:ここだけは注意せよ!
初学者が必ずと言っていいほどハマるポイントが2つあります。
1. デザイナへの反映: カスタム列を作っても、ツールボックスに自動で現れるわけではありません。まずはコードで `Me.DataGridView1.Columns.Add(New MyCustomColumn())` と動的に追加して動作確認するのが鉄則です。
2. イベントの連鎖: `CellClick` イベントでポップアップを出そうとすると、編集モードへの切り替えと競合することがあります。「編集モードに入った時(EditingControlShowing)」なのか、「クリックされた時(CellContentClick)」なのか、目的を明確に分けるのが、安定したUIを作るコツです。
—
5. まとめ:現場で愛されるエンジニアになるために
カスタム列を自作できるようになると、視界が劇的に変わります。「標準コントロールでどうやろうか?」ではなく、「どうすればユーザーが最も直感的に入力できるか?」というUX(ユーザー体験)の視点でコードを書けるようになるからです。
今回紹介した基礎をベースに、次は「バーコードリーダーの入力を拾って即座にDB検索を行う」といった高度なロジックを組み込んでみてください。
「こんな複雑なUI、VB.NETじゃ無理だよ」なんて言わせない。
この実装スキルこそが、あなたのコードを「ただのプログラム」から「業務を効率化する武器」へと進化させる鍵ですよ。
さあ、次のコードで、あなたの現場の「困った」を解決してきてください。応援しています!
