数据绑定是分离UI和后端主逻辑程序的一种好的办法。这里总结下TextBox, Label, ComboBox, ListBox, DataGridView的数据绑定
数据绑定都是通过DB来和UI控件的属性进行绑定的。因此都需要MySqlDataAdapter的Fill函数得到数据源DataTable并进行绑定
1. TextBox和Label
没有找到与DataTable里任意一行的数据绑定,只能与第一行进行绑定,如果每次都是需要通过MySqlDataAdapter来从数据库取数据,再用Fill函数来给DataTable充数据,再绑定到TextBox,显得太麻烦了。
Label和TextBox一样,都可以通过Control.DataBinding.Add("Text", dt, "Column");就完成绑定了
如果要绑定到一个类的属性上,则用
textBox1.DataBinding.Add("Text", person, "Name", true, DataSourceUpdateMode.OnpropertyChanged);
在程序对类的属性值进行修改后,控件通过textBox.DataBinding["Text"].ReadValue();来更新值,如果在控件上进行修改,离开控件焦点后会自动更新属性值
2. ComboBox和ListBox
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Name";
注意这里DisplayMember指的是ComboBox上显示的Item值,而ValueMember是实际的值。
ListBox用法跟ComboBox一样
这里可以注意到一个有趣的问题,当ListBox上选择Item的时候,ComboBox,TextBox和Label选的值也跟着一起变了,这可能是因为他们都从同一个数据源绑定的数据,而选择值时是会影响到DataTable的Select方法,进而影响到其他绑定控件,因此可以新建个DataTable,这样就不会影响到了。
ListBox的DataSource还能使enum等
listBox1.DataSource = Enum.GetValues(typeof(Week));
3. DataGridView
bindingSource1.DataSource = dt;
dataGridView1.DataSource = bindingSource1;
如果要通过dataGridView来修改数据库,当然我们可以通过写SQL语句,但是这里可以通过MySqlCommandBuilder myBuilder = new MySqlCommandBuilder(adapter);来修改数据库了
DataGridView修改后,我们首先要确定已经修改完成了,再update到DB,再change DT里
((BindingSource)dataGridView1.DataSource).EndEdit();
adapter.Update(dt);
dt.AcceptChanges();
最后我做了一个demo程序
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Diagnostics; 10 using MySql.Data; 11 using MySql.Data.MySqlClient; 12 13 namespace ControlTest 14 { 15 public partial class Form1 : Form 16 { 17 DataTable dt = new DataTable(); 18 static MySqlConnection mycon = null; 19 MySqlDataAdapter adapter; 20 public Form1() 21 { 22 InitializeComponent(); 23 } 24 25 private void Form1_Load(object sender, EventArgs e) 26 { 27 mycon = new MySqlConnection("server = 127.0.0.1; uid = root; pwd = 0219; database = persons"); 28 mycon.Open(); 29 adapter = new MySqlDataAdapter("select * from students", mycon); 30 MySqlCommandBuilder myBuilder = new MySqlCommandBuilder(adapter); 31 adapter.Fill(dt); 32 textBox1.DataBindings.Add("Text", dt, "Grade"); 33 label1.DataBindings.Add("Text", dt, "Grade"); 34 comboBox1.DataSource = dt; 35 comboBox1.DisplayMember = "Name"; 36 comboBox1.ValueMember = "Name"; 37 DataTable listDt = new DataTable(); 38 adapter.Fill(listDt); 39 listBox1.DataSource = listDt; 40 listBox1.DisplayMember = "Name"; 41 listBox1.ValueMember = "Name"; 42 bindingSource1.DataSource = dt; 43 dataGridView1.DataSource = bindingSource1; 44 mycon.Close(); 45 } 46 47 private void button1_Click(object sender, EventArgs e) 48 { 49 mycon.Open(); 50 string query = "update students set Grade = 88 where Name = 'yangzihao'"; 51 MySqlCommand mycmd = new MySqlCommand(query, mycon); 52 mycmd.ExecuteNonQuery(); 53 dt.Clear(); 54 adapter.Fill(dt); 55 mycon.Close(); 56 } 57 58 private void button2_Click(object sender, EventArgs e) 59 { 60 ((BindingSource)dataGridView1.DataSource).EndEdit(); 61 adapter.Update(dt); 62 dt.AcceptChanges(); 63 } 64 65 private void button3_Click(object sender, EventArgs e) 66 { 67 MessageBox.Show(comboBox1.SelectedValue.ToString()); 68 } 69 70 } 71 }