2011-06-18 19 views
6

フォーム(CustomerInfoForm)に10個のテキストボックスがあります。各TextBoxesのデフォルトのTextプロパティは、デザイン時に定義されています。サブクラスCustomerInfoForm.CustomerInfoには、フォームに入力されたデータを保持するプロパティが含まれています。データを含むサブクラスはXMLにシリアル化されます。自動的に生成されたフォームのコードでWinFormへのデータバインディング

は、テキストボックスのそれぞれは、自動的に各テキストボックスのC#のIDEによって生成されたテキストボックス

this.customerInfoBindingSource = new System.Windows.Forms.BindingSource(this.components); 

コードにデータソースを結合するためにコードの行を有する。

this.txtCustomer.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.customerInfoForm_CustomerInfoBindingSource, "CustomerName", true)); 
this.txtCustomer.Location = new System.Drawing.Point(60, 23); 
this.txtCustomer.Name = "txtCustomer"; 
this.txtCustomer.Size = new System.Drawing.Size(257, 20); 
this.txtCustomer.TabIndex = 0; 
this.txtCustomer.Text = "CustomerName"; 

(私は、Textプロパティは、データバインディングの後まで設定されていないことに気づきました)、IDEで生成されたコードです。

プロジェクトを実行すると、フォームはデフォルト値のTextBoxesで表示されます。しかし、SaveButtonがサブクラスMyForm.CustomerInfoのプロパティをシリアル化するために押されると、それらはすべてnullです。これらの値は、私がインターフェイスINotifyPropertyChangedを実装する必要がないことを望んでいたフォームからのみ変更されるためです。

基本的なものか簡単なものがありませんか?

データのシリアライズを含むフォームのコードは

using System; 
using System.Windows.Forms; 
using System.Xml.Serialization; 
using System.IO; 
using System.Runtime.Serialization; 

namespace SimpleCustomerInfo 
{ 
    // You must apply a DataContractAttribute or SerializableAttribute 
    // to a class to have it serialized by the DataContractSerializer. 

    public partial class CustomerInfoForm : Form 
    { 
     CustomerInfo ci = new CustomerInfo(); 

     public CustomerInfoForm() 
     { 
      InitializeComponent(); 
     } 

     private void btnSave_Click(object sender, EventArgs e) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(CustomerInfo)); 
      FileStream writer = new FileStream(@"C:\Users\Me\temp\testme.xml", FileMode.Create); 
      serializer.WriteObject(writer,ci); 
      writer.Close(); 
     } 

     [DataContract(Name = "Customer", Namespace = "net.ElectronicCanvas")] 
     public class CustomerInfo 
     { 
      [DataMember] 
      public string CustomerName { get; set; } 
      [DataMember] 
      public PhoneInfo PhonePrimary { get; set; } 
      [DataMember] 
      public PhoneInfo PhoneDays { get; set; } 
      [DataMember] 
      public PhoneInfo PhoneEvening { get; set; } 
     } 

     public class PhoneInfo 
     { 
      public string number { get; set; } 
      public string type { get; set; } 
      public bool textOk { get; set; } 
     } 
    } 
} 

EDITの下に装着されている - この質問あなたが必要とするすべての

using System; 
using System.Windows.Forms; 
using System.Xml.Serialization; 
using System.IO; 
using System.Runtime.Serialization; 

namespace SimpleCustomerInfo 
{ 


    public partial class CustomerInfoForm : Form 
    { 
     CustomerInfo ci; 

     public CustomerInfoForm() 
     { 
      InitializeComponent(); 
      ci = new CustomerInfo(); 
      ci.CustomerName = "My Customer Name"; 
      ci.PhoneDays.number = "888-888-8888"; 
      customerInfoForm_CustomerInfoBindingSource.DataSource = ci; 

     } 

     private void btnSave_Click(object sender, EventArgs e) 
     { 

      DataContractSerializer serializer = new DataContractSerializer(typeof(CustomerInfo)); 
      FileStream writer = new FileStream(@"C:\Users\me\temp\testme.xml", FileMode.Create); 
      serializer.WriteObject(writer,ci); 
      writer.Close(); 
     } 
     // You must apply a DataContractAttribute or SerializableAttribute 
     // to a class to have it serialized by the DataContractSerializer. 
     [DataContract(Name = "Customer", Namespace = "net.ElectronicCanvas")] 
     public class CustomerInfo 
     { 
      [DataMember] 
      public string CustomerName { get; set; } 
      [DataMember] 
      public PhoneInfo PhonePrimary { get; set; } 
      [DataMember] 
      public PhoneInfo PhoneDays { get; set; } 
      [DataMember] 
      public PhoneInfo PhoneEvening { get; set; } 

      // Constructor is needed to instantiate the PhoneInfo classes 
      // within the CustomerInfo class 
      public CustomerInfo() 
      { 
       PhonePrimary = new PhoneInfo(); 
       PhoneDays = new PhoneInfo(); 
       PhoneEvening = new PhoneInfo(); 
      } 
     } 

     public class PhoneInfo 
     { 
      public string number { get; set; } 
      public string type { get; set; } 
      public bool textOk { get; set; } 
     } 
    } 
} 

答えて

3

まず時に発生する可能性があり、他人のために直接データバインディングを使用するか、Textプロパティを直接操作するかを決定します。これら2つのアプローチを混在させるべきではありません。

あなたはデータバインディングを使用する場合は、コードの1行不足しているより:

public Form1() 
{ 
    InitializeComponent(); 
    customerInfoBindingSource.DataSource = ci; // This is the missing line 
} 

をあなたのcustomerInfoBindingSourceは、データ・ソースについて知るようにする必要があります。

この行を追加すると、設計時に割り当てられたTextは、バインドされたデータソースのテキストによって上書きされます。バインディングを使用する場合は、Textフィールドを直接設定するのではなく、データソースを操作する必要があります。このように:

public Form1() 
{ 
    InitializeComponent(); 

    ci.CustomerName = "TestCustomerName"; 
    customerInfoBindingSource.DataSource = ci; 
} 
+0

お返事ありがとうございます。私はWindowsフォームのコードを生成し、 'DataSource'を含む行が 'customerInfoForm_CustomerInfoBindingSource.DataSource = ci; 'であることがわかりました。 – DarwinIcesurfer

関連する問題