C#: 数据绑定

数据绑定是分离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();

C#: 数据绑定_第1张图片

最后我做了一个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 }
View Code

 

你可能感兴趣的:(数据绑定)