zoukankan      html  css  js  c++  java
  • 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。

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

  • 相关阅读:
    从架构演进的角度聊聊Spring Cloud都做了些什么?
    Spring Cloud在国内中小型公司能用起来吗?
    中小型互联网公司微服务实践-经验和教训
    springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
    springcloud(十一):服务网关Zuul高级篇
    springcloud(十):服务网关zuul初级篇
    springcloud(九):配置中心和消息总线(配置中心终结版)
    [讨论]C++编译/编辑器对OIer的必要功能
    [题解]How Many Tables HDU
    [干货]文件输入输出实例&Ptask的编写
  • 原文地址:https://www.cnblogs.com/850391642c/p/4750335.html
Copyright © 2011-2022 走看看