- PR -

DataGridViewのヘッダーにチェックボックス

投稿者投稿内容
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-23 17:54
お世話になります。
DataGridViewのヘッダーにチェックボックスを置きたいのですが可能でしょうか?
可能であればやり方を教えてください
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2009-02-24 12:59
可能です。
詳しいやり方は、MSDNにサンプルコード付きで解説されていますので
そちらを参考にしてください。

その上で、判らない点は再度質問すると良いでしょう。

【MSDN-DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する 】
http://msdn.microsoft.com/ja-jp/library/aa480727.aspx

ドロップダウンを持つヘッダ+DataGridViewのフィルタリングを行うサンプルですが
カスタム列ヘッダの作り方は理解出来ると思います。
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-24 18:16
引用:

くまっちさんの書き込み (2009-02-24 12:59) より:
可能です。
詳しいやり方は、MSDNにサンプルコード付きで解説されていますので
そちらを参考にしてください。

その上で、判らない点は再度質問すると良いでしょう。

【MSDN-DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する 】
http://msdn.microsoft.com/ja-jp/library/aa480727.aspx

ドロップダウンを持つヘッダ+DataGridViewのフィルタリングを行うサンプルですが
カスタム列ヘッダの作り方は理解出来ると思います。



ご教授ありがとうございます。
教えて頂いたページを参照して勉強します。
また何かありましたらよろしくお願いします
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-26 17:49
引用:

くまっちさんの書き込み (2009-02-24 12:59) より:
可能です。
詳しいやり方は、MSDNにサンプルコード付きで解説されていますので
そちらを参考にしてください。

その上で、判らない点は再度質問すると良いでしょう。

【MSDN-DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する 】
http://msdn.microsoft.com/ja-jp/library/aa480727.aspx

ドロップダウンを持つヘッダ+DataGridViewのフィルタリングを行うサンプルですが
カスタム列ヘッダの作り方は理解出来ると思います。



一日睨めっこしてサンプルを真似ながら少しずつコードを書いてみました。

が、とても道は遠そうです(泣)
聞くことが多過ぎて何から聞いたら良いのか分かりませんが少しずつ教えて頂けたらと思います。

最初の質問ですが、MSDNで追加しているDataGridViewAutoFilterTextBoxColumn をColumnType に追加するために必要なコードは何でしょうか?
(コンストラクタ?、プロパティ?、メソッド?)

自分で
Public Class DataGridViewColumnHeaderChechboxClass
Inherits DataGridViewColumnHeaderCell

として新しいクラスを作成したものの、ColumnType には出てきません。

よろしくお願いします
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2009-02-26 18:51
カスタムヘッダを使用するにはカスタム列クラスを作成し
カスタム列クラスが使用するヘッダとして、カスタムヘッダを指定する事になります。

まずは、カスタム列クラス(DataGridViewColumn派生クラス)を作成してください。

サンプル中にもDataGridViewAutoFilterTextBoxColumnというDataGridViewColumnを
継承したカスタム列クラスがあります。
※そこからDataGridViewAutoFilterColumnHeaderCellクラスを使用(厳密には型情報を設定)しています。

その列の実際のセルタイプが標準のセルで構わないのであれば
DataGridViewColumnから直接派生するのではなく
DataGridViewColumnから派生した標準の列クラスから派生しても構いません。
(DataGridViewTextBoxColumn等からの派生でも構いません)

DataGridViewのカスタムは面倒なので、構造?仕組み?を理解するのは大変でしょうが、
不明な点等ありましたら、答えられる限りお答えしますので、がんばってください。
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-26 23:42
ご教授ありがとうございます。
また行き詰ったら質問させて頂きますのでよろしくお願いします。
Haru
常連さん
会議室デビュー日: 2009/02/18
投稿数: 37
投稿日時: 2009-02-27 11:59
ここまで作りました。

コード:
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Windows.Forms
Imports System.ComponentModel

Public Class DataGridViewCheckBoxColumnEx
    Inherits DataGridViewCheckBoxColumn

    Public Sub New()
        MyBase.DefaultHeaderCellType = GetType(DataGridViewCheckBoxColumnExHeaderCell)
    End Sub

    <EditorBrowsable(EditorBrowsableState.Never), Browsable(False), _
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Shadows ReadOnly Property DefaultHeaderCellType() As Type
        Get
            Return GetType(DataGridViewCheckBoxColumnExHeaderCell)
        End Get
    End Property
End Class




コード:
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Diagnostics
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Imports System.Collections
Imports System.Reflection

Public Class DataGridViewCheckBoxColumnExHeaderCell
    Inherits DataGridViewColumnHeaderCell

    Public Sub New(ByVal oldHeaderCell As DataGridViewColumnHeaderCell)


        Me.ContextMenuStrip = oldHeaderCell.ContextMenuStrip
        Me.ErrorText = oldHeaderCell.ErrorText
        Me.Tag = oldHeaderCell.Tag
        Me.ToolTipText = oldHeaderCell.ToolTipText
        Me.Value = oldHeaderCell.Value
        Me.ValueType = oldHeaderCell.ValueType

        If oldHeaderCell.HasStyle Then
            Me.Style = oldHeaderCell.Style
        End If

        Dim headerCell As DataGridViewCheckBoxColumnExHeaderCell = _
            TryCast(oldHeaderCell, DataGridViewCheckBoxColumnExHeaderCell)
        If headerCell IsNot Nothing Then

        End If
    End Sub

    Public Sub New()

    End Sub

    Public Overrides Function Clone() As Object
        Return New DataGridViewCheckBoxColumnExHeaderCell(Me)
    End Function

    Protected Overrides Sub OnDataGridViewChanged()

        If Me.DataGridView Is Nothing Then
            Return
        End If
        MyBase.OnDataGridViewChanged()

    End Sub 'OnDataGridViewChanged

    Protected Overrides Sub Paint( _
    ByVal graphics As Graphics, _
    ByVal clipBounds As Rectangle, _
    ByVal cellBounds As Rectangle, _
    ByVal rowIndex As Integer, _
    ByVal cellState As DataGridViewElementStates, _
    ByVal value As Object, _
    ByVal formattedValue As Object, _
    ByVal errorText As String, _
    ByVal cellStyle As DataGridViewCellStyle, _
    ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _
    ByVal paintParts As DataGridViewPaintParts)

        ' Use the base method to paint the default appearance. 
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, _
            cellState, value, formattedValue, errorText, cellStyle, _
            advancedBorderStyle, paintParts)


    End Sub 'Paint

End Class



後は
1.ヘッダ部分にチェックボックスを表示する(デザイナー)
2.ヘッダのチェックボックスに値を設定する(プログラム&デザイナー)
3.ヘッダのチェックボックスのON/OFFのイベントを拾う(プログラム)
をやりたいです。

まずは、1番からやりたいのですがどこに何を書けば良いのでしょうか?

※教えて頂いたURL以外に参考になるところがあれば教えて下さい。

それと上記のコードを組み込んで実行してみたのですが、コンストラクタはNew()しか実行されません。
何が問題なのでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2009-02-27 12:29
2.3の項を見て、考えているイメージが違うと思いましたので、ご指摘致します。
チェックボックスコントロールと同じ機能を実装するのであって
チェックボックスコントロールの追加ではありません。

1.については、OverrideしているPaintにチェックボックスを描画するコード記述
System.Windows.Forms.CheckBoxRendererのDrawCheckBoxを使用すると楽です。

2.3.については、OnClick等をオーバーライドしてチェックボックスと同じ動き実装

って事になります。

スキルアップ/キャリアアップ(JOB@IT)