zoukankan      html  css  js  c++  java
  • 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 方法)。

  • 相关阅读:
    联赛膜你测试20 T1 Simple 题解 && NOIP2017 小凯的疑惑 题解(赛瓦维斯特定理)
    P5518
    快速除法 / 取模
    P6860
    spoj LCMSUM
    虚树 学习笔记
    长链剖分 学习笔记
    CF526G
    P4292
    01 分数规划(water)
  • 原文地址:https://www.cnblogs.com/Johness/p/2427658.html
Copyright © 2011-2022 走看看