博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm编程数据视图之DataGridView浅析(续)
阅读量:4558 次
发布时间:2019-06-08

本文共 3199 字,大约阅读时间需要 10 分钟。

  关于昨天的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
("StudentName");

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

转载于:https://www.cnblogs.com/Johness/archive/2012/03/31/2427658.html

你可能感兴趣的文章
《区块链100问》笔记整理——42~49问
查看>>
使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享
查看>>
深入理解计算机系统(1.4)---并发与并行、浅谈抽象
查看>>
函数依赖的公理化系统
查看>>
rabbitmq学习(四):利用rabbitmq实现远程rpc调用
查看>>
侯捷C++学习(二)
查看>>
EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
查看>>
web项目中全局常量的添加
查看>>
搬运工程 启动!
查看>>
局部加权回归(LWR) Matlab模板
查看>>
Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
查看>>
hibernate在使用getCurrentSession时提示no session found for current thread
查看>>
【Luogu1471】方差(线段树)
查看>>
【agc028E】High Elements(动态规划,线段树,贪心)
查看>>
DEV中svg图标的使用
查看>>
Codefroces Gym101572 I.Import Spaghetti-有向图跑最小环输出路径(Floyd)
查看>>
有关位运算的操作+二进制状态压缩
查看>>
Eclipse插件 -- 阿里巴巴扫描编码规插件
查看>>
(1.1)学习笔记之mysql体系结构(内存、进程、线程)
查看>>
markdown测试
查看>>