2013-06-24 4 views
1

У меня есть форма с некоторыми текстовыми полями, ниже мой код:C# WinForm текстовое поле DataBind собственности

public partial class Test : Form 
{ 
    private readonly ICustomerBl _customerBl; 
    private readonly BindingSource _bindingSource1; 

    public Test(ICustomerBl customerBl) 
    { 
     _bindingSource1 = new BindingSource(); 

     _customerBl = customerBl; 

     InitializeComponent(); 
    } 

    public Customer Customer { get; set; } 

    private void Test_Load(object sender, EventArgs e) 
    { 
     // Method 1 
     textBox2.DataBindings.Add(new Binding("Text", Customer, "Name")); 

     // Method 2 
     textBox3.DataBindings.Add("Text", _bindingSource1, "Email", true, DataSourceUpdateMode.OnPropertyChanged); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (_customerBl.Get(textBox1.Text) != null) 
     { 
      Customer = _customerBl.Get(textBox1.Text).First(); 
      _bindingSource1.Add(Customer); 
     } 
    } 

Customer.cs

public class Customer : Entity 
{ 
    public virtual string Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Address1 { get; set; } 
    public virtual string Address2 { get; set; } 
    public virtual string Address3 { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Email { get; set; } 
    public virtual string JoinDate { get; set; } 
    public virtual string Status { get; set; } 
    public virtual string ContactPerson { get; set; } 
    public virtual string TaxId { get; set; } 
    public virtual double CreditLimit { get; set; } 
    protected internal virtual IList<RentalAgreement> RentalAgreements { get; protected set; } 
    protected internal virtual IList<RentalWithdrawal> RentalWithdrawals { get; protected set; } 

    public virtual RentalAgreement GetActiveRental() 
    { 
     return RentalAgreements.FirstOrDefault(rental => rental.Status == "ACTIVE"); 
    } 

    public virtual bool HasRentalAgreement() 
    { 
     return RentalAgreements.Count > 0; 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 

Я пытался использовать 2 метода, как выше показывает , но никто не работает.

Необходим ввод здесь.

Спасибо!

Update:

Извините за не ясно, мой вопрос заключается в том, как правильно добиться привязок данных между текстовым полем и свойством, в этом случае свойство имеет тип клиента. И я ожидаю, что привязка данных обновит текстовое поле2 с помощью Customer.Name, когда я обновил свойство Customer формы.

Спасибо!

+3

'И ваши на самом деле вопросы - это то, что .. ????' – MethodMan

+0

Ужасно, если я не буду чист. Мой вопрос: как добиться привязки данных между текстовым полем и свойством объекта. :) –

+0

Почему бы не использовать 'BindingList' и создать 2 отдельных. вы, вероятно, получаете одни и те же данные в обоих текстовых полях, если это так, то почему. .. в использовании 'BindingList' – MethodMan

ответ

0

Ваш Customer класс должен реализовать IBindableComponent так:

public class Customer : Entity, IBindableComponent { 
    //Your code 
    //Members of IBindableComponent 
    ISite iSite; 
    ControlBindingsCollection dataBindings; 
    BindingContext bindingContext = new BindingContext(); 
    public Customer(){ 
     dataBindings = new ControlBindingsCollection(this); 
    } 
    public event EventHandler Disposed; 
    public void Dispose(){ 
     //your code for disposing 
    } 
    public BindingContext BindingContext { 
     get { return bindingContext;} 
     set {bindingContext = value;} 
    } 
    public ControlBindingsCollection DataBindings { 
     get { return dataBindings;} 
    } 
    public ISite Site { 
     get { return iSite;} 
     set {iSite = value;} 
    } 
} 

Все члены IBindableComponent должны быть добавлены к вашему Customer класса, вы можете найти больше о том, чтобы реализовать IBindableComponent интерфейс.

+0

Я действительно понял, почему мой код не работает, потому что, когда я связываю Customer.Name с текстовым полем3, Клиент по-прежнему имеет значение null, которое странно выдает исключение без звука, которое требуется для отображения блока catch try. Теперь мне нужно выяснить, как связать, даже если объект имеет значение null в начале. –

+0

Я думаю, что если ваш 'Customer' имеет значение NULL, должно возникнуть исключение, я не думаю, что исключение может быть тихим. «DataBindings» требует источника данных, и, конечно, сам элемент управления не равен нулю. Вы не можете привязывать данные таким образом. Если ваш 'Customer' становится нулевым и загружается новыми данными, вам нужно снова добавить привязку данных ... Вы должны загрузить в него некоторые данные, это единственный способ. Даже вы загружаете данные в свой «Клиент», мой код выше по-прежнему необходим для привязки его свойств к некоторым другим элементам управления ». –