アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、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
========================================================

A 回答 (2件)

ColumnsHeadプロパティが変更された際に、最後にthis.Refresh();を実施して、OnPaint()を走行させたらいかがですか。

    • good
    • 0
この回答へのお礼

「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
=======================================




本当に何度も確認していただきありがとうございます。

よろしくお願い申し上げます。

お礼日時:2020/11/27 20:30

変更の通知を受けたいなら、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クラス
    • good
    • 0
この回答へのお礼

お返事が遅くなり申し訳ありません。

Listだとイベントは受け取りないのですね。。
現行のシステムではListを変更できないのですが
大変勉強になりました。

教えていただいた処理も試させていただきます。

ご回答ありがとうございました。

お礼日時:2020/12/02 11:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!