快速提问:
我有一个usercontrol,我正在向它传递一个业务对象,以便进行编辑和保存。保存后不会销毁usercontrol,而是在下一个businessobject传递给它之前隐藏它。
问题是我无法刷新控件中的数据,除非我这样做:
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的数据源?哦,是的,它是在设计师中设置的。嗯......如果我再次设置它而不是删除和添加绑定回来?“并猜测是什么,有效。
谢谢你们。
答案 0 :(得分: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);
基本上将entityBo
替换为bindingSource
。现在,只要你需要选择一个不同的对象(包括初始对象),你就可以完成
bindingSource.DataSource = entityBo;
就是这样 - 数据绑定基础设施将负责其余部分。