2017-04-10 132 views
1

快速提问:C#Winforms数据绑定

我有一个用户控件,我传递一个业务对象给它,以便进行编辑和保存。保存后,用户控件不会被销毁,而是在下一个业务对象传递给它之前隐藏。

问题是我不能刷新数据的控制,除非我这样做:

UsernameTextEdit.DataBindings.Clear(); 
UsernameTextEdit.DataBindings.Add("EditValue", entityBo, "Username", true, DataSourceUpdateMode.OnPropertyChanged); 
LastNameTextEdit.DataBindings.Clear(); 
LastNameTextEdit.DataBindings.Add("EditValue", entityBo, "LastName", true, DataSourceUpdateMode.OnPropertyChanged); 
FirstNameTextEdit.DataBindings.Clear(); 
FirstNameTextEdit.DataBindings.Add("EditValue", entityBo, "FirstName", true, DataSourceUpdateMode.OnPropertyChanged); 

不知道如果我这样做的权利。我相信,它是一个更好的方式。我其实需要的是某种

UsernameTextEdit.DataBindings.Refresh() 

或类似的东西,因为控件已绑定将businessObject性质,我需要的是让他们再次读取该死的值。

有没有这样的事情?我错过了什么吗?

谢谢

==============================

我张贴的BusinessObject的模型虽然我无法捉摸如何做到这一点帮助,因为它工作正常首次

namespace ServiceManager.Bll.Model 
{ 
    [Table("Users")] 
    public class UsersBo : BaseBo 
    { 
     [Display(Name = "Nume utilizator")] 
     [Required(ErrorMessage = "Numele de utilizator este obligatoriu.")] 
     [MaxLength(100, ErrorMessage = "Numele de utilizator nu poate depăși 100 de caractere.")] 
     public string Username { get; set; } 

     [Display(Name = "Parola")] 
     [Required(ErrorMessage = "Parola este obligatorie.")] 
     [MaxLength(100, ErrorMessage = "Parola nu poate depăși 100 de caractere")] 
     public string Password { get; set; } 

     [Display(Name = "Prenume")] 
     [Required(ErrorMessage = "Prenumele este obligatoriu")] 
     [MaxLength(100, ErrorMessage = "Prenumele nu poate depăși 100 de caractere")] 
     public string FirstName { get; set; } 

     [Display(Name = "Nume")] 
     [Required(ErrorMessage = "Numele este obligatoriu.")] 
     [MaxLength(100, ErrorMessage = "Numele nu poate depăși 100 de caractere.")] 
     public string LastName { get; set; } 

     [Display(Name = "E-mail")] 
     [MaxLength(100, ErrorMessage = "Adresa e-mail nu poate depăși 100 de caractere")] 
     public string Email { get; set; } 

     [Display(Name = "Telefon")] 
     [MaxLength(50, ErrorMessage = "Numărul de telefon nu poate depăși 50 de caractere")] 
     public string Phone { get; set; } 

     [Display(Name = "Activ")] 
     public bool IsActiv { get; set; } 

     [Display(Name = "Administrator")] 
     public bool IsAdmin { get; set; } 

     [ScaffoldColumn(false)] 
     public DateTime LastUpdate { get; set; } 
    } 
} 

======================= ==== 后来编辑:

嗯,你知道当你向某人解释你的问题时会发生什么,并在你说话时弄清楚它会发生什么?

在我的情况是“嘿,我在设置BindingSource的数据源?哦,是的,它是在设计器中设置的。嗯...如果我再次设置它,而不是删除并添加绑定背部?”并猜测是什么,工作。

谢谢你们。

+1

发布您的型号代码。你的模型应该是'INotifyPropertyChanged' – Emad

+0

在你发布的代码中没有证据表明你的模型对象实现了'INotifyPropertyChanged'或者每个属性都有'XXXChanged'事件的旧约定。当源值发生变化时,为了更新绑定的目标,需要一个或另一个。如果这还不足以让您发现问题,则需要解决问题,以便它包含一个可靠地再现问题的良好[mcve]。 –

+1

@PeterDuniho这个问题似乎与单个属性绑定无关。看起来好像OP在问如何重新绑定到不同的对象实例。 –

回答

2

问题是,你的绑定绑定到一个具体的实例,因此必须在实例更改时重新创建。

为了允许一次数据绑定设置,您需要一些间接 - 它可能是一个特殊对象,业务对象是一个可选属性(例如类似public UsersBo Current { get; set; }的东西,所以您通过嵌套绑定绑定到该对象,如“Current .NAME”等,或通过添加BindingSource组件字段到类使用BindingSource组分用于该目的如下

开始:

private BindingSource bindingSource; 

然后,执行一个时间数据结合建立(在构造或负载事件):

bindingSource = new BindingSource(); 
bindingSource.DataSource = typeof(UsersBo); // to allow binding w/o actual object 
// statically bind the controls to the binding source 
UsernameTextEdit.DataBindings.Add("EditValue", bindingSource, "Username", true, DataSourceUpdateMode.OnPropertyChanged); 
LastNameTextEdit.DataBindings.Add("EditValue", bindingSource, "LastName", true, DataSourceUpdateMode.OnPropertyChanged); 
FirstNameTextEdit.DataBindings.Add("EditValue", bindingSource, "FirstName", true, DataSourceUpdateMode.OnPropertyChanged); 

基本上用替换为bindingSource。现在,只要你需要选择一个不同的对象(包括最初的),你可以简单地做

bindingSource.DataSource = entityBo; 

,这就是它 - 数据绑定的基础设施港岛线照顾的休息。

+0

谢谢。非常好,非常明确的答案,非常感谢。 –