ようこそ。睡眠不足なプログラマのチラ裏です。

データバインディング その1


単純にSystem.Windows.Forms.Formを継承したFormに配置したTextBoxのTextプロパティに対して、
特定のクラスのプロパティをバインドする方法の1つを示します。


方法その1、.NET Framework 1.1の場合。

「プロパティ名 + Changed」 イベントの提供

これだけです。他のタイプのコントロールだったりすると、
他にも考慮すべきことはあるのですが、TextBoxのTextプロパティとのバインドであれば、これだけです。


以下、C#およびVB.NETのコード。

[C#]
    public class Form1 : System.Windows.Forms.Form
    {
    ///いろいろ省略
        private User m_SystemUser = new User() ;

        private User SystemUser
        {
        get{
            return m_SystemUser;
            }
        set{
            m_SystemUser = value;
            }
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            this.TextBox1.DataBindings.Add("Text",this.SystemUser,"Name");
        }

        private void Button1_Click(object sender, System.EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show(this.SystemUser.Name);
        }

        private void Button2_Click(object sender, System.EventArgs e)
        {
            this.SystemUser.Name = "太郎";
        }

    }
}

[C#]
    public class User
    {
        public User()
        {
        }

        public event EventHandler NameChanged;

        private string m_Name = string.Empty;
        
        public virtual string Name{
            get{
                return m_Name;
            }
            set{
                if (m_Name.Equals(value)) {
                    return;
                }
                m_Name = value;
                this.OnNameChanged(new EventArgs());
            }
        }

        protected virtual void OnNameChanged(EventArgs e)
        {
            NameChanged(this,e);
        }
    }
}

[VB.NET]
Public Class Form1
  Inherits System.Windows.Forms.Form

  '''いろいろ省略

  Private m_SystemUser As New User

  Private Property SystemUser() As User
    Get
      Return m_SystemUser
    End Get
    Set(ByVal Value As User)
      m_SystemUser = Value
    End Set
  End Property

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.TextBox1.DataBindings.Add("Text", Me.SystemUser, "Name")
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox(Me.SystemUser.Name)
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Me.SystemUser.Name = "太郎"
  End Sub
End Class

[VB.NET]
Public Class User

  Public Event NameChanged As EventHandler

  Private m_Name As String = String.Empty

  Public Sub New()

  End Sub

  Public Property Name() As String
    Get
      Return m_Name
    End Get
    Set(ByVal Value As String)
      If m_Name.Equals(Value) Then
        Return
      End If
      m_Name = Value
      Me.OnNameChanged(New EventArgs)
    End Set
  End Property

  Protected Overridable Sub OnNameChanged(ByVal e As EventArgs)
    RaiseEvent NameChanged(Me, e)
  End Sub
End Class


■関連リンク
MSDN:イベントとイベント ハンドラ
MSDN:方法 : イベントをクラスに追加する