2016-04-22 6 views
2

は、私は、次のクラスがありますフォーム上のテキストボックスコントロールがBindingSource介して、このクラスのインスタンスにバインドされラムダ式を使ってプロパティを更新するにはどうすればいいですか?

public class MyClass 
{ 
    public int? Field1 { get; set; } 
    public int? Field2 { get; set; } 
} 

を、データソースは、OnValidatedイベントに更新されます。テキストボックスが空の場合しかし、それがバインドのプロパティが更新されていない

(前回値が再び表示されている):

だから、私は次のように追加したコントロールOnValidatingイベントで:

int value; 
bool ok = int.TryParse(((TextBox)sender).Text, out value); 
if (!ok) 
{ 
    myClassInstance.Field1 = null; 
} 

質問:

  1. BindingSourceの正常な動作を超えるときの値は空ですか?

  2. OnValidatingイベントで呼び出せる汎用メソッドを使用することはできますか?ような何か:オブジェクトインスタンスが参照されていないため

    OnValidatingMethod((TextBox)sender, x => x.Field1); 
    

上記のコード行は明らかに動作しません。しかし、私はそれのようなものが可能かどうか疑問に思っていましたか?クラスへの拡張かもしれません:

myClassInstance.SetProperty(((TextBox)sender).Text, x => x.Field1); 

答えて

1

データバインディングのアイデア全体は、ソースからターゲットを抽象化することです。このようなイベントハンドラを作成すると、抽象化は終了します。

あなたが見るものは当然のことではありませんが、「下位互換性」のために非常に古いバグが残っているためです。これは長い時間前にBindingクラスに追加のプロパティを追加することで修正されましたが、下位互換性のためにデフォルト値は古い動作を模倣するように設定されています。あなたが期待通りに動作するように設定する必要が

プロパティはtrueFormattingEnabled、および""NullValueです。私は通常、このようなすべての情報を指定することができますDataBindings.AddまたはBindingコンストラクタのオーバーロード、のいずれかを使用します。ここでは

textBox.DataBindings.Add("Text", bs, "Field1", true, DataSourceUpdateMode.OnValidation, ""); 

がいっぱいのデモです:最後に

using System; 
using System.Windows.Forms; 

namespace Samples 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      var form = new Form(); 
      var textBox1 = new TextBox { Parent = form, Left = 16, Top = 16 }; 
      var textBox2 = new TextBox { Parent = form, Left = 16, Top = textBox1.Bottom + 16 }; 
      var bs = new BindingSource { DataSource = typeof(MyClass) }; 
      textBox1.DataBindings.Add("Text", bs, "Field1", true, DataSourceUpdateMode.OnValidation, ""); 
      textBox2.DataBindings.Add("Text", bs, "Field2", true, DataSourceUpdateMode.OnValidation, ""); 
      bs.DataSource = new MyClass { Field1 = 1, Field2 = 2 }; 
      Application.Run(form); 
     } 
    } 

    public class MyClass 
    { 
     public int? Field1 { get; set; } 
     public int? Field2 { get; set; } 
    } 
} 

、あなたが本当に関与することにしたい場合解析部分では、ハンドラをBinding.Parseイベントに接続する必要があります。

+1

説明していただきありがとうございます。いつものように、すばらしい答えです! –

関連する問題