在以前用datagridview的时候,就是把datagridview.dataSource= list,然后再来一下this.dgvInBogieInfo.Columns["ID"].HeaderText
= “张三”,这样就能实现显示一个列了,但是最近做项目的时候,一直在接触datagridview,所以对这个控件又有了许多新的用法,在这里总结一下。
1、显示
首先说一下显示,其实datagridview1的数据源可以有种,不止List<>集合,还有datatable,但是如果用DatagridView1有一点不好,那就是我们查询的时候简单了,但是在以后维护的时候难免会多几行代码。还有一点就是,我们用list的时候,我们一般是List<XXEntity>,也就是实体集合,可以说是一个不标准的面向对象,而Datatable,从table就可以看出,他是一个表,如果是实体,那么就是一个兑现,如果是数据库里的表,那就是和业务有关系的了。毕竟咱们设计表的时候总是会把一个业务的数据放到一起。
2、DataGridView之间的数据传输。
说一下我的业务,我要对某一个信息进行增删改查,例如我要将一些信息发给别人,那么我就需要在第一个页面上显示我要发送的消息,我们暂且称其为窗体A:
如上图所示,我要在选择添加按钮的时候,弹出一个窗体,然后里边有我需要的信息,如下图:窗体B:
但是现在我有一个要求,就是在这个里边的转向架信息,我们是只选择,但是我需要把datagridview中的信息和上边文本框中的信息传输给第一个窗体,这个怎么办呢,这就是我接下来要说的了。
首先思路是这个样子,我先把datagridview中的信息和上边文本框中的信息保存到datagridview中,然后让窗体A去获取B窗窗体中的DataTable。
大概就是A->DataTable<-B,定义一个全局变量,这样就可以实现datagridview的数据传输问题。代码如下:
窗体B中的代码:
public static DataTable tempDT = null; //添加一个新表,用来将选择的数据发到主界面的datagridview中 //为临时的datatable(tempDT)创建新列 tempDT.Columns.AddRange(new DataColumn[] { new DataColumn("S_BUREAUNUMNO",typeof(string)), new DataColumn("S_SERIALNUM",typeof(string)), new DataColumn("S_TRAINSETID",typeof(string)), new DataColumn("S_BOIGETYPE",typeof(string)), new DataColumn("S_BOIGESTATE",typeof(string)), new DataColumn("S_CURRMILE",typeof(string)), new DataColumn("S_OUTUNIT",typeof(string)), new DataColumn("S_INUNIT",typeof(string)), new DataColumn("S_REMARK",typeof(string)), new DataColumn("S_OUTDATE",typeof(string)), new DataColumn("S_EMPLOYEE",typeof(string)), new DataColumn("ID",typeof(int)) }); //将datagridview中的数据保存到datatable中 DataRow dr = null; foreach (DataGridViewRow item in this.DGVAddBogie.Rows) { dr = tempDT.NewRow(); dr["S_BUREAUNUMNO"] = item.Cells["S_BUREAUNUMNO"].Value; dr["S_SERIALNUM"] = item.Cells["S_SERIALNUM"].Value; dr["S_TRAINSETID"] = item.Cells["S_TRAINSETID"].Value; dr["S_BOIGETYPE"] = item.Cells["S_BOIGETYPE"].Value; dr["S_BOIGESTATE"] = item.Cells["S_BOIGESTATE"].Value; dr["S_CURRMILE"] = item.Cells["S_CURRMILE"].Value; dr["S_REMARK"] = this.textBox1.Text; dr["S_OUTUNIT"] = OutUnit; dr["S_INUNIT"] = InUnit; dr["S_OUTDATE"] = AddDate; dr["S_EMPLOYEE"] = EmployeeName; dr["ID"] = item.Cells["ID"].Value; tempDT.Rows.Add(dr); }
窗体A的代码
DataTable dt = FrmB.tempDT; This.DatagridView.DataSource = dt;
3、选中行:
选中行的问题我在这里再说一下,我们只需要在添加列的时候将ColumnType的属性设置成DataGridViewComboBoxColumn就可以了,然后运用的时候如下代码就可以:
/根据部产品标识码,产品序列号来修改接收状态 for (int i = 0; i < dt.Rows.Count; i++) { string ck = this.DGVOutBogie.Rows[i].Cells["Choice"].EditedFormattedValue.ToString(); if (ck == "True") { ……(“自己的操纵就可以了”) }
当然传数据的做法也不是很好,因为有一个静态变量public
static DataTabletempDT =
null,也就是其他的窗体也都可以访问,但是毕竟涉及到类和类之间的数据传输,暂时还没有想到更好的办法,就用了这种办法,如果有什么其他方法,谢谢指正。