• WinForm中如何通过绑定完成数据的分发和收集
  • 发布于 2个月前
  • 243 热度
    0 评论
在WinForm中,有很多添加和修改数据的场景,一般的做法是当点击“添加”按钮时,收集各控件的值,然后赋值给实体类的各个属性,然后再完成保存工作。在修改时,首先把实体的原值,一个个赋值给控件,修改保存时,再反过来把值赋给实体,最后持久化保存。除了这种做法,用绑定也是可以完成数据的分发和收集,绑定可以把实体的原值赋给控件,修改完控件后,实体的属性值也一起变化了,最后持久化提交实体就可以了。

举个例子:下面是一些实体类。
record Person
{
    public string Name { get; set; }
    public Sex Sex { get; set; }
    public DateTime Birthday { get; set; }
    public Tel Tel { get; set; }
    public bool IsResult { get; set; }
    public bool IsTest { get; set; }
    public List<Goods> Goodses { get; set; } 
    public string GoodsString
    {
        get
        {
            var s = "";
            foreach (var goods in Goodses)
            {
                s += goods;
            }
            return s;
        }
    }
}
enum Sex
{
    男,
    女
}
record Goods
{
    public int ID { get; set; }
    public string Name { get; set; }
    public double Quantity { get; set; }
    public decimal Price { get; set; }
}
有实体类后,模拟加载数据:
Person person = new Person
{
    Name = "桂素伟",
    Sex = Sex.女,
    Tel = new Tel { Name = "手机", No = "13333333333" },
    Birthday = DateTime.Parse("1979-06-22"),
    Goodses = new List<Goods>
    {
        new Goods{ID=1, Name="商品A", Price=1.1m,Quantity=10},
        new Goods{ID=2, Name="商品B", Price=2.1m,Quantity=20},
    }
};
接下来就是绑定了,不同数据类型的属性,绑定的控件不一样,这里更举了几种(为了了解是什么控件,控件名称没有作更改):
private void Form1_Load(object sender, EventArgs e)
{
   //TextBox绑定最简单
    textBox1.DataBindings.Add(new Binding("Text", person, "Name"));
   //DateTimePicker绑定与TextBox类型,时间类型属性绑定
    dateTimePicker1.DataBindings.Add(new Binding("Text", person, "Birthday"));
   //先把集合绑定到ComboBox,再绑定,绑定时要用控件的SelectedItem属性
    comboBox1.DataSource = Enum.GetValues(typeof(Sex));
    comboBox1.DataBindings.Add(new Binding("SelectedItem", person, "Sex"));
    //这是最常用的绑定
    dataGridView1.DataSource = person.Goodses;
    //CheckBox绑定bool类昔
    checkBox1.DataBindings.Add(new Binding("Checked", person, "IsTest"));
    //如查外部集合,赋值DataSource,再绑定
    listBox1.DataSource = new List<Tel>
    {
        new Tel{Name="手机",No="13333333333" },
        new Tel{Name="电话",No="88888888" },
    };
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "No";
    listBox1.DataBindings.Add(new Binding("SelectedItem", person, "Tel"));
    //对于实体属性,拆分成RadioButton两个控件,需特殊处理
    radioButton1.DataBindings.Add(new Binding("Checked", person, "IsResult"));
    var b = new Binding("Checked", person, "IsResult");
    b.Format += B_Format;
    b.Parse += B_Parse;
    radioButton2.DataBindings.Add(b);
}
当然这不是合部,具体和用的控件有很大关系,不过当把大部分控件都撸过一次后,都可以抽象成一个自用的库,更简单,更快捷使用。-
用户评论