
現在、DataGridViewのヘッダタイトルを複数行表示できるような独自コントロールを作成しています。
-----------------------|
グループ3-1 |
-----------------------|
グループ2-1 | グループ2-2 |
-----------------------|
AAA | BBB | CCC | DDD |
-----------------------|
前提としては
すでに前任者が作成した独自のコントロール(DataGridView)が有り、
その独自コントロールに機能を拡張しています。
複数行表示の方法は、DataGridViewの「Columns」をクリックすると「コレクションエディタ」が起動するように
「ColumnsHead」という自作プロパティを追加し、「Columns」と同様に「コレクションエディタ」を用いています。
そこで列/行毎のタイトルをセットし、表示しています。
≪ColumnsHead≫
| グループ2タイトル | グループ3タイトル |
-----|----------------|---------------|
AAA | グループ2-1 | グループ3-1 |
BBB | グループ2-1 | グループ3-1 |
CCC | グループ2-2 | グループ3-1 |
DDD | グループ2-1 | グループ3-1 |
複数行表示対応は「OnPaint」で制御しており、
ヘッダの複数行表示については、実行して画面を起動するとうまく表示されています。
ただ、「ColumnsHead」プロパティの値を変更しても、すぐForm画面に反映されずに困っています。
(デザイン画面を一度閉じて開き直す or 実行 すると反映されます)
既存の「Columns」にある「HeaderText」の値を変更すると、Formのタイトルがすぐに変わるように
グループタイトルを変更するとすぐにFormのタイトルも変わってほしいのですが
プロパティの変更イベントのタイミングが分かりません。
プロパティでグループタイトルを変更すると、すぐにForm画面に反映できるよう
イベントを取得出来る方法はないでしょうか。
説明足らずな部分も多いとは思いますが、
ご教授お願い致します。
≪独自コントロール≫
========================================================
<Serializable()>
Public Class ColumnsStyle
''' <summary>グループ2タイトル</summary>
Private _GroupTitle2 As String
<System.ComponentModel.Category("タイトル")> _
Public Property GroupTitle2() As String
Get
Return _GroupTitle2
End Get
Set(value As String)
_GroupTitle2 = value
End Set
End Property
''' <summary>グループ3タイトル</summary>
Private _GroupTitle3 As String
<System.ComponentModel.Category("タイトル")> _
Public Property GroupTitle3() As String
Get
Return _GroupTitle3
End Get
Set(value As String)
_GroupTitle3 = value
End Set
End Property
Public Sub New()
_GroupTitle2 = ""
_GroupTitle3 = ""
End Sub
End Class
Public Class SampleDataGridView
Inherits DataGridView
Private _ColumnsStyle As New List(Of ColumnsStyle)
Public Property ColumnsStyle As List(Of ColumnsStyle)
Get
Return _ColumnsStyle
End Get
Set(value As List(Of ColumnsStyle))
_ColumnsStyle = value
End Set
End Property
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Me._ColumnsStyle.Item(i).GroupTitle2やGroupTitle3を用いて
複数行対応の描画処理
End Sub
End Class
========================================================
No.2ベストアンサー
- 回答日時:
変更の通知を受けたいなら、ListクラスではなくObservableCollectionクラスを利用する必要があります。
Listクラスだけでは値の出し入れについてイベント通知を受けることはできません。
Public Class SampleDataGridView
Inherits DataGridView
Public Sub New()
AddHandler Me._ColumnsStyle.CollectionChanged, AddressOf ColumnsStyle_CollectionChanged
End Sub
Private _ColumnsStyle As New ObservableCollection(Of ColumnsStyle)()
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
Public ReadOnly Property ColumnsStyle As ObservableCollection(Of ColumnsStyle)
Get
Return _ColumnsStyle
End Get
End Property
Private Sub ColumnsStyle_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
Me.Refresh()
End Sub
End Class
ただし、CollectionChangedイベントは、既存のColumnsコレクションと同じタイミングでイベントが発生するものではありません。
全く同じような動作を求めるなら、Columnsプロパティのように、
下記クラスを用意して、自前で動作を実装させる必要がでてきます。
・DataGridViewColumnsStyleCollectionクラス
・それを編集するためのUITypeEditorとしての
DataGridViewColumnStyleCollectionEditorクラス
お返事が遅くなり申し訳ありません。
Listだとイベントは受け取りないのですね。。
現行のシステムではListを変更できないのですが
大変勉強になりました。
教えていただいた処理も試させていただきます。
ご回答ありがとうございました。
No.1
- 回答日時:
ColumnsHeadプロパティが変更された際に、最後にthis.Refresh();を実施して、OnPaint()を走行させたらいかがですか。
「ColumnsStyle」と「ColumnsStyle」が混在していました。
大変申し訳ございません。
「ColumnsStyle」で統一致します。
下記のようなDataGridViewの自作コントロールを作成しています(dll)
別質問で教えていただいた「Columns」変更時のイベントは取得できたのですが
「ColumnsStyle」変更時のイベントが取得出来ていない状態です。
名称を間違えていたソースを再提示致します。
≪独自コントロール≫ ※[SampleDataGridView]は変わりないです。
==========================================
<Serializable()>
Public Class ColumnsStyle
''' <summary>グループ2タイトル</summary>
Private _GroupTitle2 As String
Public Property GroupTitle2() As String
Get
Return _GroupTitle2
End Get
Set(value As String)
_GroupTitle2 = value
End Set
End Property
''' <summary>グループ3タイトル</summary>
Private _GroupTitle3 As String
Public Property GroupTitle3() As String
Get
Return _GroupTitle3
End Get
Set(value As String)
_GroupTitle3 = value
End Set
End Property
End Class
=======================================
本当に何度も確認していただきありがとうございます。
よろしくお願い申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
先着1,000名様に1,000円分もらえる!
教えて!gooから感謝をこめて電子書籍1,000円分プレゼント
-
VBAのやり方
Visual Basic(VBA)
-
vb.net 自作プロパティの削除について
Visual Basic(VBA)
-
VBA
Visual Basic(VBA)
-
4
VBA VLookUPについて助けて下さい。
Visual Basic(VBA)
-
5
エクセルVBA→シート名でCSV出力する際、シートの文字列はそのままで、CSVでは文字を置き換えて出
Visual Basic(VBA)
-
6
SQLのKEYに扱いについて
Visual Basic(VBA)
-
7
VB
Visual Basic(VBA)
-
8
プログラミング友達を探せるサービスはありますか?
その他(プログラミング・Web制作)
-
9
VBAのコマンド教えてください
Visual Basic(VBA)
-
10
マクロ:テキストフィアルをexcelに読み込む
Visual Basic(VBA)
-
11
プログラミングは難しい?
その他(プログラミング・Web制作)
-
12
Excel VBAのステップイン
Visual Basic(VBA)
-
13
VBAのコードどこが間違ってるか教えてください。
Visual Basic(VBA)
-
14
VBAコード、どこが間違ってるか教えてください
Visual Basic(VBA)
-
15
VBA本体の参照の仕方が分かりません( ノД`)
Visual Basic(VBA)
-
16
エクセルのユーザーフォーム作成
Visual Basic(VBA)
-
17
ワイルドカードの入力を禁止したい。
Visual Basic(VBA)
-
18
vba 自分で自分を閉じてしまった
Visual Basic(VBA)
-
19
excel vba で複数ファイルの表を一つのファイルにまとめたい
その他(Microsoft Office)
-
20
VBA基本構文の作り方 エラー・・・???
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
ACCESS2010 ActiveXコントロー...
-
5
エクセルの画像にツールチップ...
-
6
コンボボックスの高さを変更し...
-
7
checkbox付きListViewで デフ...
-
8
VB2005 コードでのコントロー...
-
9
ADOのCursorLocationプロパティ
-
10
DataGridViewで行の展開みたい...
-
11
PictureBoxの背景色変更(VB.NET)
-
12
中国文字のプログラムでの取り扱い
-
13
TableLayoutPanelでspan
-
14
VB6でLabelの最前面にText Box...
-
15
Wordテキストコントロールが未...
-
16
C# アプリ終了時に設定を記憶...
-
17
VB.NETで縦書表示をしたいので...
-
18
コンボボックスに表示される形式
-
19
ListViewで1つを選択して詳細...
-
20
ExcelテキストボックスのTab順...
おすすめ情報