現在、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.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
=======================================
本当に何度も確認していただきありがとうございます。
よろしくお願い申し上げます。
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を変更できないのですが
大変勉強になりました。
教えていただいた処理も試させていただきます。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCでbitmapを背景にしてstatic...
-
DataGridViewで行の展開みたい...
-
リストコントロールのデータの...
-
テキストボックス(VBA)でEnter...
-
Excelのワークシートでのコンボ...
-
DataGridで左詰め、右...
-
エクセルの画像にツールチップ...
-
VB.NETで縦書表示をしたいので...
-
Wordテキストコントロールが未...
-
C# アプリ終了時に設定を記憶...
-
TreeViewでToolTipTextを表示し...
-
Enabled=Falseのテキストボック...
-
VBで、tableの列を動的に増やす...
-
VB2005 コードでのコントロー...
-
ADOのCursorLocationプロパティ
-
PictureBoxの背景色変更(VB.NET)
-
C# TEXTが空白であるLABELは何...
-
コンボボックスの高さを変更し...
-
ACCESS2010 ActiveXコントロー...
-
ユーザーフォームに日付を表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックス(VBA)でEnter...
-
ADOのCursorLocationプロパティ
-
Wordテキストコントロールが未...
-
エクセルの画像にツールチップ...
-
ACCESS2010 ActiveXコントロー...
-
ユーザーフォームに日付を表示...
-
コンボボックスの高さを変更し...
-
C# TEXTが空白であるLABELは何...
-
VB.NETで縦書表示をしたいので...
-
VBからエクセルのテキストボ...
-
エクセル入力規制リスト行数
-
DataGridViewで行の展開みたい...
-
チェックボックスの文字色の変え方
-
デザインモードを解除すると消...
-
VB6でLabelの最前面にText Box...
-
Enabled=Falseのテキストボック...
-
C# アプリ終了時に設定を記憶...
-
PictureBoxの背景色変更(VB.NET)
-
checkbox付きListViewで デフ...
-
VC++のエディットボックスの非表示
おすすめ情報