2016-04-22 2 views
1

私は現在、顧客クラスからのリクエストをwinformに解析しようとしています。 私は作成したWCFサービスを通じてコン​​テンツを取得しています。ここでC#winformsデータがwcfリクエストにテキストボックスをバインドする

はForm1のコードです:ここで

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btn_search_Click(object sender, EventArgs e) 
    { 
     Dictionary<string, string> dict = new Dictionary<string, string>(); 
     int valueParsed; 
     if(txt_KNr.TextLength == 6) 
     { 
      if(Int32.TryParse(txt_KNr.Text.Trim(), out valueParsed)) 
      { 
       Service svc = new Service(); 
       WcfServiceGVO.CustomerData data = svc.Connect(txt_KNr.Text); 
       dict = svc.SplitData(data); 
       txt_FirstName.DataBindings.Add("Text", data, "FirstName", false, DataSourceUpdateMode.OnPropertyChanged); 
       txt_LastName.DataBindings.Add("Text", data, "LastName"); 
       txt_Street.DataBindings.Add("Text", data, "Street"); 
       txt_PLZ.DataBindings.Add("Text", data, "PLZ"); 
       txt_Location.DataBindings.Add("Text", data, "Location"); 
       lbl_ampErg.DataBindings.Add("Text", data, "Ampel"); 
      }} 

がReference.csの一部

 public string LastName { 
     get { 
      return this.LastNameField; 
     } 
     set { 
      if ((object.ReferenceEquals(this.LastNameField, value) != true)) { 
       this.LastNameField = value; 
       this.RaisePropertyChanged("LastName"); 
      } 
     } 
    } 

であることが初めて動作しますが、二回目は、コンパイラは2つのバインディングが(あると言いますだから私のDataBindings button_Clickではなく、InitializeComponent()の下にあるべきではないと思います 私はそれを行う場合、コードが実行されますが、テキストボックスを更新しません。私の要求がサーバーからデータを取得するとすぐにテキストボックスが更新されるように、私は何を変更する必要がありますか?プロパティーが変更された場合は、インターフェースを更新する必要があります。

答えて

1

オプション1 - クイックフィックス

は、クイックフィックスは新しいBindingを追加する前にDataBindingsコレクションをクリアされます。

オプション2 - コード

をのBindingSourceを使用して、それはDataSourceだとしてあなたはコードでBindingSourceへのデータバインディングを実行し、その後、モデルのコードとセットタイプでBindingSourceを作成することができます。次に、データをロードするときに、バインディングソースのプロパティにデータを割り当てます。DataSourceたとえば:

private BindingSource bindingSource1 = new BindingSource(); 
private void Form1_Load(object sender, EventArgs e) 
{ 
    bindingSource1.DataSource = typeof(Model1); 
    this.textBox1.DataBindings.Add("Text", bindingSource1, "Property1", true, 
            DataSourceUpdateMode.OnValidation); 
    this.textBox2.DataBindings.Add("Text", bindingSource1, "Property2", true, 
            DataSourceUpdateMode.OnValidation); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    bindingSource1.DataSource = GetData(); 
} 

オプション3 - デザイナー支援

あなたは、設計時にデータバインディングのBindingSourceコンポーネントを使用することができます。 フォームにBindingSourceコンポーネントを配置し、デザイン時にデータソースプロパティを目的のタイプに設定できます。次に、デザイナを使用してデータバインディングを設計時にサポートします。テキストボックスとラベルをそのバインディングソースにバインドすることができます。データをロードするときは、DataSourceプロパティにデータを割り当ててください。BindingSource

詳細情報:

+0

あなたはそのコード例を提供できますか? – Zoba

+0

最初のオプションは必ずあなたの問題を解決します。 2番目のオプションは、このリンクを読んでください:[新しいデータソースの追加](https://msdn.microsoft.com/en-us/library/8s2t4x15.aspx)特にこの部分[サービスのデータソース](https:// msdn 。microsoft.com/en-us/library/8s2t4x15.aspx#Anchor_1) –

+0

手順は非常に簡単です。プロジェクトへのサービス参照を追加すると、必要な型が 'DataSource'ウィンドウに追加されます。項目を手動でウィンドウに追加することもできます。 'CustomerData'の近くのドロップダウンを使用して' Details'モードを選択し、 'CustomerData'をドラッグしてフォームにドロップすると、' BindingSource'とセットアップデータバインディングが表示されますあなたとあなたは必要に応じてそれらを変更します。それで、実行時にデータを取得し、 'BindingSource'の' DataSource'に割り当てるだけで十分です。 –

0

私が持っていた問題は、私はUIにテキストボックスをドラッグ&ドロップできることを理解していたとどのように実際にそれをしてください。

private void btn_search_Click(object sender, EventArgs e) 
    { 
     Dictionary<string, string> dict = new Dictionary<string, string>(); 
     int valueParsed; 
     if(txt_KNr.TextLength == 6) 
     { 
      if(Int32.TryParse(txt_KNr.Text.Trim(), out valueParsed)) 
      { 
       Service svc = new Service(); 
       WcfServiceGVO.CustomerData data = svc.Connect(txt_KNr.Text); 
       customerDataBindingSource.DataSource = data; 
       //txt_FirstName.DataBindings.Add("Text", data, "FirstName"); 
       //txt_LastName.DataBindings.Add("Text", data, "LastName"); 
       //txt_Street.DataBindings.Add("Text", data, "Street"); 
       //txt_PLZ.DataBindings.Add("Text", data, "PLZ"); 
       //txt_Location.DataBindings.Add("Text", data, "Location"); 
       //lbl_ampErg.DataBindings.Add("Text", data, "Ampel");      
      } 
} 

キーは私がちょうどデータソースとしての私のserviceDataを使用することができることを理解することだった!私は私の前に次のコードを追加しましたので、今では動作しているようです素晴らしいお手伝いをしてくれてありがとうReza!

関連する問題