WinForm编程数据视图之DataGridView浅析(续)

  关于昨天的DataGridView我觉得有必要补充一下。

  首先,我们发现DataGridView上的项(即行DataGridViewRow)有一个DataBoundItem属性(参见http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewrow.databounditem(VS.80).aspx),可以帮助我们拿到绑定到当前行的对象(记住,只读的)。

  当然,拿到的是一个object类型,您将其转化为需要的类型(即其本来的类型) 就可以拿到该对象的数据进行操作了。

  比如上一次我们说到:将保存有若干员工信息的集合直接或使用泛型类BindingList绑定到DataGridView上,我们可以在运行时通过DataGridView上DataGridViewRow的DataBoundItem属性拿到该行对应的对象。

  比如下面代码:

1 // 定义数据源
2 // List<?> list = new List<?>();
3
4 // 绑定数据源
5 // dataGridView1.DataSource = new BindingList<?>(list);
6
7 // 在运行时拿到
8 // ? obj_name = dataGridView1.Rows[i].DataBoundItem as ?;

  道理很简单,数据源的绑定过程中会执行将对象的属性值分配到列显示,并将项的DataBoundItem属性引用到该对象。

  那么可能会有举一反三的朋友会想:如果我把数据库表或者数据视图作为数据源绑定呢?

  大家应该相信:解决的办法肯定是有的,首先,不管绑定的数据类型是什么,具体到每一行上,肯定是一个对象,通过该对象的属性和方法。我们就能求解问题。

  首先,我们通过实验获得当绑定DataView作为数据源时每一行绑定到的对象类型。

  我们可以编写如下代码:

 1        // 在一个初始化的事件或方法中完成
2
3        // 取得数据
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 // 绑定数据
10 dataGridView1.DataSource = ds.Tables[0].DefaultView;

  在另一个事件或方法(界面呈现时的)中使用消息框或者通过断点调试中查看具体类型,结果我们得到此时DataGridView的每一行绑定的对象类型为System.Data.DataViewRow,从字面上理解就是数据列的视图。

  于是,事情变得简单了。我们还是利用DataBoundItem属性将对象拿到,只不过将对象类型改为它真正的类型就可以了嘛。

  具体实现如下:

 1      // 窗体加载
2 private void Form1_Load(object sender, EventArgs e)
3 {
4 // 取得数据
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 // 绑定数据
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 }

  拿到对象了,实际上如果我们没有使用过也没什么大不了,文档可以查,引擎可以搜,大不了我一个个属性和方法试……

  当然,我在这里就直接将如何使用以上取得对象的方法做简单的描述:

 1            // 拿到对象
2          // 如果您是将DataTable作为数据源而非DataView,拿到的对象类型就是应为DataRow
3 DataRowView drv = dataGridView1.Rows[i].DataBoundItem as DataRowView;
4
5 // 首先通过列的视图拿到列
6          // 如果您是将DataTable作为数据源而非DataView,您可以省略此步骤
7 DataRow row = drv.Row;
8
9 // 然后通过列的Field方法拿到具体的需要的字段(相对于数据库表结构)或者说列的具体内容
10          // 该方法重载很多中,且支持泛型,十分强大
11          // 比如,我们使用通过字段名(或列名)返回代表该列内容的字符串的重载版本
12 string stuName = row.Field<string>("StudentName");

  更多内容参见http://msdn.microsoft.com/zh-cn/library/system.data.datarow.field(VS.90).aspx(DataRow.Field 方法)。

posted @ 2012-03-31 21:33  云中双月  阅读(1844)  评论(0编辑  收藏  举报