WinForm编程数据视图之DataGridView浅析(续)
關(guān)于昨天的DataGridView我覺得有必要補(bǔ)充一下。
首先,我們發(fā)現(xiàn)DataGridView上的項(即行DataGridViewRow)有一個DataBoundItem屬性(參見http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewrow.databounditem(VS.80).aspx),可以幫助我們拿到綁定到當(dāng)前行的對象(記住,只讀的)。
當(dāng)然,拿到的是一個object類型,您將其轉(zhuǎn)化為需要的類型(即其本來的類型)?就可以拿到該對象的數(shù)據(jù)進(jìn)行操作了。
比如上一次我們說到:將保存有若干員工信息的集合直接或使用泛型類BindingList綁定到DataGridView上,我們可以在運(yùn)行時通過DataGridView上DataGridViewRow的DataBoundItem屬性拿到該行對應(yīng)的對象。
比如下面代碼:
1 // 定義數(shù)據(jù)源2 // List<?> list = new List<?>();
3
4 // 綁定數(shù)據(jù)源
5 // dataGridView1.DataSource = new BindingList<?>(list);
6
7 // 在運(yùn)行時拿到
8 // ? obj_name = dataGridView1.Rows[i].DataBoundItem as ?;
道理很簡單,數(shù)據(jù)源的綁定過程中會執(zhí)行將對象的屬性值分配到列顯示,并將項的DataBoundItem屬性引用到該對象。
那么可能會有舉一反三的朋友會想:如果我把數(shù)據(jù)庫表或者數(shù)據(jù)視圖作為數(shù)據(jù)源綁定呢?
大家應(yīng)該相信:解決的辦法肯定是有的,首先,不管綁定的數(shù)據(jù)類型是什么,具體到每一行上,肯定是一個對象,通過該對象的屬性和方法。我們就能求解問題。
首先,我們通過實驗獲得當(dāng)綁定DataView作為數(shù)據(jù)源時每一行綁定到的對象類型。
我們可以編寫如下代碼:
1 // 在一個初始化的事件或方法中完成2
3 // 取得數(shù)據(jù)
4 SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=db_MySchool;User ID=sa;Password=12345");
5 SqlDataAdapter adapter = new SqlDataAdapter("select * from tb_Student", con);
6 DataSet ds = new DataSet();
7 adapter.Fill(ds);
8
9 // 綁定數(shù)據(jù)
10 dataGridView1.DataSource = ds.Tables[0].DefaultView;
在另一個事件或方法(界面呈現(xiàn)時的)中使用消息框或者通過斷點調(diào)試中查看具體類型,結(jié)果我們得到此時DataGridView的每一行綁定的對象類型為System.Data.DataViewRow,從字面上理解就是數(shù)據(jù)列的視圖。
于是,事情變得簡單了。我們還是利用DataBoundItem屬性將對象拿到,只不過將對象類型改為它真正的類型就可以了嘛。
具體實現(xiàn)如下:
1 // 窗體加載2 private void Form1_Load(object sender, EventArgs e)
3 {
4 // 取得數(shù)據(jù)
5 SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=db_MySchool;User ID=sa;Password=12345");
6 SqlDataAdapter adapter = new SqlDataAdapter("select * from tb_Student", con);
7 DataSet ds = new DataSet();
8 adapter.Fill(ds);
9
10 // 綁定數(shù)據(jù)
11 dataGridView1.DataSource = ds.Tables[0].DefaultView;
12 }
13
14 // DataGridView.RowsAdded事件
15 private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
16 {
17 for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
18 {
19 // 拿到對象
20 DataRowView drv = dataGridView1.Rows[i].DataBoundItem as DataRowView;
21 }
22 }
拿到對象了,實際上如果我們沒有使用過也沒什么大不了,文檔可以查,引擎可以搜,大不了我一個個屬性和方法試……
當(dāng)然,我在這里就直接將如何使用以上取得對象的方法做簡單的描述:
1 // 拿到對象2 // 如果您是將DataTable作為數(shù)據(jù)源而非DataView,拿到的對象類型就是應(yīng)為DataRow
3 DataRowView drv = dataGridView1.Rows[i].DataBoundItem as DataRowView;
4
5 // 首先通過列的視圖拿到列
6 // 如果您是將DataTable作為數(shù)據(jù)源而非DataView,您可以省略此步驟
7 DataRow row = drv.Row;
8
9 // 然后通過列的Field方法拿到具體的需要的字段(相對于數(shù)據(jù)庫表結(jié)構(gòu))或者說列的具體內(nèi)容
10 // 該方法重載很多中,且支持泛型,十分強(qiáng)大
11 // 比如,我們使用通過字段名(或列名)返回代表該列內(nèi)容的字符串的重載版本
12 string stuName = row.Field<string>("StudentName");
更多內(nèi)容參見http://msdn.microsoft.com/zh-cn/library/system.data.datarow.field(VS.90).aspx(DataRow.Field 方法)。
轉(zhuǎn)載于:https://www.cnblogs.com/Johness/archive/2012/03/31/2427658.html
總結(jié)
以上是生活随笔為你收集整理的WinForm编程数据视图之DataGridView浅析(续)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios网络请求
- 下一篇: pickle模块介绍