双方向データバインド
.NET Framwork: 4.5
Visual Studio: 2019C 16.4.1
今回は、VB 案件で試したので、VB で。
本体プロジェクト(Windows フォームアプリ)とは別に
ユーザコントロール用クラスライブラリプロジェクトを作成。
(以下、コントロールプロジェクト)
コントロールプロジェクトを新規作成。
デフォルトで用意されたファイルに、テキストボックスなどを配置。
Public Class ProfileEntity
Public Property FirstName() As String = ""
Public Property FamilyName() As String = ""
Public Property Age() As Integer = 0
Public Property Gender() As Integer = 0
End Class
そして、性別ラジオボタンのデータバインディングをどうすればよいか
と考えたら、全然思いつかなかった。
Google 先生にも質問してみたけど
ドンピシャの回答は得られなかった。
今後の課題。
- [データソース] ビューで、[新しいデータソースの追加]
- 「データソースの種類の選択」ダイアログ
- [オブジェクト] を選択
- [次へ]
- 「データ オブジェクトの選択」ダイアログ
- ツリーを開いて、対象オブジェクトにチェック
- [完了]
- コントロールデザインへ、DataSource コントロールを配置
- DataSource コントロールの DataSource プロパティから
- [他のデータソース]-[プロジェクト データソース]-[(先程登録したオブジェクト)]
- DataSource コントロールの DataSource プロパティから
- フォーム上の各コントロールの (DataBindings) の対象プロパティへ、オブジェクトプロパティをバインディング
- ComboBox:SelectedValue プロパティ?
- TextBox:Text プロパティ
- ソースへデータオブジェクトのインスタンスを、DataSource へ設定するメソッドを追加
Public Sub SetDataSource(ByVal profile As ProfileEntity)
Me.DataSource1.DataSource = profile
End Sub
試行錯誤に書いた通り、DataSource プロパティを外から設定することはできない。
- コントロールプロジェクトをビルド
- 本体プロジェクトを新規作成
- 本体プロジェクト内の [参照] のコンテキストメニューから [参照の追加]
- 「参照マネージャー」ダイアログ
- [参照] から、コントロールプロジェクトの .dll を選択
- コントロール追加 の手順でツールボックスへ自作コントロールを追加
- 自作コントロールを、ツールボックスからフォームへ D&D
MSDN:とあるコンサルタントのつぶやき Part 1. 双方向データバインドの基本的な使い方(2009-02-26)
→とてもわかりやすい解説
@IT:WPF/UWP:ラジオボタンを双方向バインディングするには?[C#/VB](2016-02-03)
→ラジオボタンにおける双方向データバインド
UserControl クラスを継承するのに、下記のように書いたら
と怒られた。
Public Class ProfileControl Inherits UserControl
End Class
これが正解。
Public Class ProfileControl
Inherits UserControl
End Class
メンバ変数ではダメ。
これでは、データバインディングのときに
選択肢として出てこなかった。
Public Class ProfileEntity
Public FirstName As String = ""
End Class
プロパティとして宣言すれば問題なかった。
けど、これは古い書き方らしい。
Public Class ProfileEntity
Private _firstName As String = ""
Public Property FirstName() As String
Get
Return _firstName
End Get
Set(value As String)
_firstName = value
End Set
End Property
End Class
コントロールを利用するフォーム側で DataSource を設定しようとしたら
できなかった。
なので、コントロール側に、DataSource を設定するメソッドを追加した。