在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);
}
當然這不是合部,具體和用的控件有很大關系,不過當把大部分控件都擼過一次后,都可以抽象成一個自用的庫,更簡單,更快捷使用。