分類:[C#]
2014/01/13(Mon) 11:39:31 編集(投稿者)
2014/01/13(Mon) 11:37:47 編集(投稿者)
2014/01/13(Mon) 11:37:30 編集(投稿者)
<pre><pre>Formアプリで、DataTimePickerおよびNumericUpDownコントロールを自分で定義したクラスオブジェクトへバインドした場合の動作が、
期待していた動作と違うので教えてください。
やりたいことは、
自作Personクラスを定義し、FormにPersonオブジェクトの各メンバに対応するコントロールを配置して、
入力された内容をデータバインドにてPersonオブジェクトに反映させることです。
具体的には、Personクラスに、「名前」「誕生日」「年齢」プロパティを用意し、Formには
名前(TextBox)、誕生日(DatetimePicker)、年齢(NumericUpDown)の各コントロールを張り付けます。
コードはこんな感じです。
○Personクラス
class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private DateTime _birthDay;
public DateTime BirthDay
{
get { return _birthDay; }
set { _birthDay = value; }
}
private decimal _age;
public decimal Age
{
get { return _age; }
set { _age = value; }
}
public Person()
{
_birthDay = new DateTime(2014, 1, 20);
}
}
○入力用フォーム
public partial class Form1 : Form
{
private Person hoge = new Person();
private void Form1_Load(object sender, EventArgs e)
{
bindingSource1.DataSource = hoge; // デザイナでフォームに貼り付けてある
txtName.DataBindings.Add("Text", bindingSource1, "Name"); // 名前
dateTimePicker1.DataBindings.Add("Value", bindingSource1, "BirthDay"); // 誕生日
numericUpDown1.DataBindings.Add("Value", bindingSource1, "Age"); // 年齢
}
}
上記コーディングで、
データバインディング機能により、コントロールからフォーカスが離れたとき(離れようとするとき?)に、
Personクラスのセッターメソッドが呼ばれ、クラスオブジェクトのメンバに値が設定されると考えていました。
しかしながら、たとえば
dateTimePicker1で1月をキーボードの「2」キー押下により2月に変更した後、
ほかのコントロールへ移動してもPersonの誕生日セッターメソッドが呼び出されません。(ブレークポイントを設定して確認)
続けてdateTimePicker1にフォーカスを戻して何の変更も行わずにフォーカスを移動すると、変更していないのにセッターメソッドが呼ばれます。
1月を「矢印」キー押下で2月に変更したときは、期待通りに動きます。
それで教えていただきたいのですが、
これってコーディングで何か抜けていることがありますか?
この現象を回避するにはどのようにしたら良いでしょうか。
よろしくお願いいたします。(NumericUpDownでも同様の動きでした。)
</pre></pre>