上述可能些绕,上个图片吧,便于理解:
//注:新加列是由前两列派生而来,不是直接源于oracle sql(存储过程或sql)
部门编号 部门名称 新加列
1 销售部 1销售部
2 账务部 2账务部
我把这种情况称为datagridview列表视图的混合数据源
我的示例代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
using System.Collections;
namespace openfiledialog
{
public partial class Form1 : Form
{
//spec及special为列表中非同直接oracle sql查询得到的数据源,而是由其转换来得到的数据源
private string spec;
public string special
{
get
{
return spec;
}
}
public Form1()
{
InitializeComponent();
}
public DataSet ds1= new DataSet();
private void Form1_Load(object sender, EventArgs e)
{
OracleConnection con1 = new OracleConnection("Data Source=orcl;User id=scott; Password=system;");//oracleconnection类隶属于命名空间system.data.oracleclient
OracleCommand oc1 = new OracleCommand("select deptno,dname from dept", con1);
OracleDataAdapter da1 = new OracleDataAdapter();
da1.SelectCommand = oc1;
da1.Fill(ds1);
this.dataGridView1.DataSource = ds1.Tables[0];
//通过它向datagridview添加一个datacolumn列,
ds1.Tables[0].Columns.Add("special");
//循环datagridview的每行datarow(此时datarow已变为三列,由原二列变为三列,新增列即由ds1.Tables[0].Columns.Add("special")添加而来
foreach (DataRow dr in ds1.Tables[0].Rows)
{
//每条datarow要新加一个列哟,在原有数据库查询的基础上,借助属性实现
//最终实现把经过转换后的列也添加到列表中来,不用bo类可以实现吗
//this.Add(spec);
//把新添加列到datatable中
//为属性special对应的spec字段供值
spec = dr["deptno"] + "新加列";
//向datagridview的新增列special供值,注意:是以属性来供值的,而此属性special是在设计器中配置好的,datapropertyname配置为special
//这样数据源就与属性关联,进而属性与字段关联;
dr["special"] = special;
}
}
}
}
代码运行结果:
小结:
datagridview的数据源可以是联动数据源(直接或派生数据源),
也就是说它的数据源可以是多次动态加工或复杂的组合而成的,不是我以前认为的就是从ORACLE 表或游标取出的数据;而是可以基于此数据进行复杂的处理,以此作为datagridview的数据源
datagridview的每个datagridviewdatacolumn的列填充值是多种方式,在此我们是采用了属性,以前我多看到的直接的oracle sql的某个列