winform 数据(双向)绑定 快速更新实体

写点东西感觉特别累,也已经很久没写了。

  最近在做一个winform类型的系统,其涉及到大量的表,有些表又包含大量的字段,所以当添加、更新实体时便会十分的繁琐,一方面:需要把界面上的字段绑定到对应的实体(简单点就是对象)上去,另一方面:需要把字段值赋值给界面上的控件。当字段的数量到一定数量时,便费时费力。

  下面是我看到一种较好的方式,自己写的示例。

  1主要原理

  微软为控件类写了个绑定方法Control.DataBindings,这个方法的作用是将控件的某个属性值与对象的某个属性值进行绑定,通俗的意思是维持控件的属性值与对象的属性值相等,这就是双向绑定的意思。

  2实现

  定义了一个Person类,并定义一些成员,如下图所示,“喜好”字段绑定的是combox,所以它的数据源是list,list中对象定义的类型是LikeT,liket就简单的定义了显示成员与值成员。

  在窗体初始化时,实例化person类为Men对象,并将其绑定到界面的控件上。当更改控件中的内容时,DataBindings会自动将其更新回Men对象。为了验证Men对象的内容是否改变,便添加了一个显示Men对象成员的按钮,点击则会将Men对象显示出来。

  当我改变Name和OneDay后点击显示Men按钮

  3实现代码如下

public Person Men { get; set; }
public IList<LikeT> AllLikes { get; set; }
public Form1()
{
InitializeComponent();

Men = new Person
{
Name = "mine",
IsAdult = true,
IsSpecial = "是",
Like = "1",
OneDay = DateTime.Now,
Introduce = "share one technolog"
};

AllLikes = new List<LikeT>
{
new LikeT() {ShowNumber = "a book", ValueNumber = "1"},
new LikeT() {ShowNumber = "a person", ValueNumber = "2"},
new LikeT() {ShowNumber = "a point", ValueNumber = "3"}
};

textBox1.DataBindings.Add("Text", Men, "Name");
checkBox1.DataBindings.Add("Checked", Men, "IsAdult");
dateTimePicker1.DataBindings.Add("Value", Men, "OneDay");
//下拉选择框
comboBox1.DataSource = AllLikes;
comboBox1.DisplayMember = "ShowNumber";
comboBox1.ValueMember = "ValueNumber";
comboBox1.DataBindings.Add("SelectedValue", Men, "Like");
textBox2.DataBindings.Add("Text", Men, "Introduce");
//自定义数据格式,有兴趣可以看看
Binding b = new Binding("Checked", Men, "IsSpecial");
// Add the delegates to the event.
b.Format += new ConvertEventHandler(StringToBool);
b.Parse += new ConvertEventHandler(BoolToString);
checkBox2.DataBindings.Add(b);
}
private void StringToBool(object sender, ConvertEventArgs cevent)
{
// The method converts only to string type. Test this using the DesiredType.
if (cevent.DesiredType != typeof(bool)) return;

// Use the ToString method to format the value as currency ("c").
cevent.Value = cevent.Value.ToString() == "是";
}

private void BoolToString(object sender, ConvertEventArgs cevent)
{
// The method converts back to decimal type only.
if (cevent.DesiredType != typeof(string)) return;

// Converts the string back to decimal using the static Parse method.
if ((bool)cevent.Value)
{
cevent.Value = "是";
}
else cevent.Value = "否";
}

private void button1_Click(object sender, EventArgs e)
{
l_Men.Text = JsonConvert.SerializeObject(Men);
}

  4说明

  person有个IsSpecial字段,这个字段如果类型设计为bool类型,那么如同IsAdult一样简单,但是我项目的数据库设计为String类型,且字段长度为vachar2,存不下true或者false,存0或者1也许可以吧,但不知道对接的时候有没有问题,所以我就强制让是否来代替true或者false。

  意识仅为个人看法,如果不当,希望能给我打几个字,衷心感谢。

 

posted on 2015-08-22 15:23  放逐人  阅读(9185)  评论(0编辑  收藏  举报

导航