Привязка данных к WinForm - PullRequest
6 голосов
/ 18 июня 2011

У меня есть форма (CustomerInfoForm) с 10 TextBox. Свойство Text по умолчанию для каждого из TextBoxes определяется во время разработки. Подкласс CustomerInfoForm.CustomerInfo содержит свойства для хранения данных, введенных в форму. Подкласс, содержащий данные, будет сериализован в XML.

В автоматически сгенерированном коде формы каждое из текстовых полей имеет строку кода для привязки источника данных к текстовому полю

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

Код, автоматически генерируемый C # ide для каждого текстового поля:

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 все они равны нулю. Поскольку эти значения будут изменены только из формы, я надеялся, что мне не нужно было реализовывать интерфейс 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; }
        }
    }
}

РЕДАКТИРОВАТЬ - Для других, которые могут возникнуть по этому вопросу

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; }
        }
    }
}

1 Ответ

3 голосов
/ 18 июня 2011

Прежде всего вам необходимо решить, использовать ли привязку данных или напрямую манипулировать свойством Text.Эти два подхода не следует смешивать друг с другом.

Если вы хотите использовать привязку данных, вам не хватает одной строки в коде:

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

Вам необходимо сообщить своему customerInfoBindingSource оисточник данных.

Если вы добавите эту строку, то Text, назначенный во время разработки, будет переопределен текстом из вашего привязанного источника данных.Если вы хотите использовать привязку, вам следует манипулировать источником данных, а не устанавливать поля Text напрямую.Как это:

public Form1()
{
    InitializeComponent();

    ci.CustomerName = "TestCustomerName";
    customerInfoBindingSource.DataSource = ci;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...