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