C# 我把数据库里的数据放到datatable里面,然后在datagridview中显示。

比方说datatable里面有3列值(日期、机构名称、交通事故次数)。我在datagridview里显示就要把日期作为datagridview的字段名,然后机构名称就在datagridview的第一列里面显示。然后对应的交通事故次数显示在哪我想各位也应该大概了解。我现在就是怎么样把datatable里面的数据在datagridview像我说的那样?希望各位大侠帮忙。

DataTable dt = pdao.GetCPI(); //pdao.GetCPI()方法是 从数据库获取数据返回值为datatable类型

dataGridView1.DataSource = dt; // dataGriView1为我的 datagridview的

你说要设的列名 在sql语句里查的时候直接该 比如(select name as '姓名' , age as '年龄' from table )
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-28
建议用listview吧,这个操作性强。专研究java了,C#忘得差不多了,就不帮你整了,提个意见 。最好自己弄个控件吧,反正DateGridView是绝对做不出这功能的,别在这钻牛角尖,换思路吧
第2个回答  2011-07-28
意思你要动态生成列
日期为列名,机构名称是行名,中间对应的数据是各机构在每个日期中发生的交通事故次数?
是不是这个意思?追问

恩 对对。。就是这样。而且还有一点就是 datatable里面显示的日期和机构名称可能会有重复的,比方
日期 机构名称 事故次数 要在datagridview中这么显示
2010 上海 20 年份 2010 2011
2010 广州 10 上海 20 10
2011 上海 10 广州 10 50
2011 广州 50

追答

查了很久,问了高手,都没有做过。比较复杂,还需要研究。你搜搜datagridview动态添加列试试。我要是研究会了再告诉你。

追问

我也是查了datagridview动态添加列 但是没查到类似的列子。急死了。。。希望你能帮帮我哦。。。

第3个回答  2011-07-28
不知道datagridview有米有封装有方法,我是使用手动的方法来绑定值的。楼主可以参考下
先说一下步骤
1、给datagridview增加空白行,行数=datatable的行数
2、循环依次绑定值

代码如下:
dataGridView1.Rows.Add(dt.Rows.Count);//步骤1
for (int i = 0; i < dtTarget.Rows.Count; i++)//步骤2
{
dataGridView1["日期", i].Value = dt.Rows[i]["日期"];
dataGridView1["机构名称", i].Value = dt.Rows[i]["机构名称"];
dataGridView1["交通事故次数", i].Value = dt.Rows[i]["交通事故次数"];
}追问

我看了一下,你这么写,一开始给datagridview添加行,而且这行数等于dt里面的行,这样不行的。我已经把datatable里面的日期那列值作为了datagridview的列名,交通事故次数作为datagridview第一列里面的值。做个比方,x 和 y x代表日期,y代表机构名称,那么交通事故次数则为x,y。这点能看明白吗?

追答

额,不好意思,刚刚没有看明白楼主的意思。
根据楼主的需求,步骤应该如下
1、搜索数据库,获取年份数量和机构总量。说明下,其实可以自己写算法通过datatable来获得这2个数据的,但是算法写起来很烦,而且效率很低,所以不如直接用SQL语句来获得。
2、添加datagridview的列。这里需要注意,因为datagridview的列是动态生成,所以在EXE里的datagridview不用设置列属性。
3、给datagridview增加空白行,行数=机构名称的总量
4、循环依次绑定值

代码参考,请自行组合。
1)
SQL语句参考,SELECT distinct [机构] from [表名],distinct 为去掉重复
然后将搜索到的结果,用一个数组保存,这里记做string[] Address和string[] Year

2)
dataGridView1.Columns.Add("time", "年份");
for (int i = 0; i < Year.Count-1; i++)
{
dataGridView1.Columns.Add(Year[i],Year[i]);
}

3)
dataGridView1.Rows.Add(Address.Count);

4)
for (int i = 0; i < Address.Count-1; i++)
{
dataGridView1["time", i].Value = dt.Rows[i][Address[i]];//添加机构
//搜索dt,按时间排序
DataRow[] dr = dt.Select("机构="Address[0],"日期");
for(int j=0; j<dr.Length-1; j++)
{
dataGridView1[Year[i], i].Value = dr[i][“事故次数”];
}
}
要注意一点的是,数据库中每个机构在每个日期必须有值,没有也要用0代替

纯手写,可能有点语法错误,逻辑有点复杂,楼主慢慢看把。
可能就是那个DataTable.Select有点奇怪,楼主可以查一下。

追问

这位大侠,非常感谢你。能不能搞个源码过来啊。我现在头脑特乱,你写的代码,讲的思路我都理不清了。谢谢。。。。。

追答

修改了下代码,运行测试了没问题。
下面代码中有个SqlHelper类,只是减少数据库访问的代码而已,具体的SQL语句是有的,数据访问部分请自行解决。
数据表结构如下
Time varchar(4)
Name varchar(10)
Count int
------------------------
SqlHelper sh = new SqlHelper("Data Source=.;Initial Catalog=test;Integrated Security=True");
//第一步,搜索数据库,获取所有数据、年份、机构。说明下,其实可以自己写算法通过datatable来获得这2个数据的,但是算法写起来很烦,而且效率很低,所以不如直接用SQL语句来获得。
DataTable dt = sh.ExecuteQuery("SELECT * FROM table1", null, CommandType.Text);
DataTable dtAddress = sh.ExecuteQuery("SELECT distinct name FROM table1", null, CommandType.Text);
DataTable dtTime = sh.ExecuteQuery("SELECT distinct time FROM table1", null, CommandType.Text);

//第二步,添加datagridview的列。这里需要注意,因为datagridview的列是动态生成,所以在EXE里的datagridview不用设置列属性。
dataGridView1.Columns.Add("time", "年份");
for (int i = 0; i < dtTime.Rows.Count; i++)
{
dataGridView1.Columns.Add(dtTime.Rows[i][0].ToString(), dtTime.Rows[i][0].ToString());
}

//第三步,给datagridview增加空白行,行数=机构名称的总量
dataGridView1.Rows.Add(dtAddress.Rows.Count);

//第四步,循环依次绑定值
for (int i = 0; i < dtAddress.Rows.Count; i++)
{
dataGridView1["time", i].Value = dtAddress.Rows[i][0];//添加机构
//搜索dt,按时间排序
DataRow[] dr = dt.Select("Name='" + dtAddress.Rows[i][0] + "'", "Time");
for (int j = 0; j < dr.Length; j++)
{
dataGridView1[dtTime.Rows[j][0].ToString(), i].Value = dr[j]["Count"];
}
}
-----------------------
请将以上代码复制到Button的点击事件下,注意,dataGridView控件的名称为dataGridView1
同时再次强调,第一步获取数据,DataTable的部分自行修改下。

本回答被网友采纳
相似回答