2016-06-27 18 views
2

WinFormsデザイナーで作業するための基本的なデータバインディングを取得できないようです。Visual Studioでの基本的なWinFormsデータバインディング(デザイナーモード)

  1. (VS2012を使用して)私は新しい勝利がDatabindTestと呼ばれるフォームアプリケーションプロジェクトを作成します。
  2. このプロジェクトには、Class1.csというクラスを追加します。
  3. このクラスでは、MyPropertyを "abc"に設定するコンストラクタとともに、MyPropertyという名前の(String)プロパティを作成します。
  4. 私はソリューションをビルドします。
  5. Form1デザイナを使用して、フォーム(textBox1)にテキストボックスを追加します。
  6. [textBox1のプロパティ]で、[データバインディング]を展開して[詳細設定]ダイアログを開きます。 enter image description here
  7. 私はバインディングドロップダウンを展開して、プロジェクトデータソース...を追加し、オブジェクトデータソースを選択しをクリックします。次に、DatabindTestノードを展開し、Class1をデータオブジェクトとして選択します。 enter image description here
  8. Bindingフィールドに「class1BindingSource - MyProperty」と表示されることが確認されています(期待通りです)。
  9. Form1クラスの先頭のForm1.csに、私はClass1の新しいインスタンスを作成します(下記のコードを参照)。
  10. この時点で、私はプログラムをビルドして起動します。私は、テキストボックスに "abc"が表示されると予想しますが、それは空です。

どうしたのですか?

public partial class Form1 : Form 
{ 
    Class1 c1 = new Class1(); 
    public Form1() 
    { 
     InitializeComponent(); 
     //this.textBox1.Text = c1.MyProperty; //if I uncomment this line, 
               //"abc" appears in textBox1 
               //so why not through databinding? 
    } 
} 
+1

次のコード行を書くのを忘れた: 'class1BindingSource。DataSource = c1'; 'Load'の形式です。 –

答えて

2

あなたはclass1BindingSourceDataSourceを設定する必要があります。

class1BindingSource.ِDataSource = c1; 

あなたがデザイナーを見ている場合は、テキストボックスとデータバインディング用のコードを生成し、次のようなコードが表示されます

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", 
           this.class1BindingSource, "MyProperty", true)); 

ご覧のとおり、class1BindingSourceはデータバインディングのデータソースであり、DataSourceにデータを渡してに表示する必要がありますプロパティはtextBox1です。

+0

ああ、確かにそれは私を逃した魔法の秘密だった。私が困惑しているのは、なぜ「高度な」データバインディングウィザードが自動的にこれを処理しないのでしょうか?実際、デザイナが生成したコードの後で、私はこの行を見つけました: 'this.class1BindingSource.DataSource = typeof(DatabindTest.Class1);'これは何もしませんでした。オブジェクトの特定のインスタンスに直接バインドする方法はありますか? – kmote

+1

'this.class1BindingSource.DataSource = typeof(DatabindTest.Class1);'これはデザイナーのサポートのためのものです。設計者は、データバインディングで使用するタイプを知ることができます。これにより、リストからプロパティを選択するときに、デザイナーがプロパティグリッドのデータバインディングセクションにプロパティのリストを表示します。 –

+0

バインディングソースは、コントロールと実際のオブジェクトの間のインターフェイスに過ぎません。バインディング・ソースはデータのロード先を知らないので、 'class1BindingSource.DataSource = c1;'が生成されることは期待できません。たぶん、ビジネスロジッククラスやサービスなどのデータをロードしたいと思うかもしれません。 –

関連する問題