Winform开发中DataGridView的深层研究(一)----格式化显示信息(1)

    摘要:1)、由于图片上传功能依然关闭,本节依然以文字形式完成。待功能恢复后相关图片会马上上传。

             2)、在Winform开发中,DataGridView在项目中发挥着不可或缺的作用,数据信息的显示、信息的项目操作(增、删、改、查)等等。但是很大一部分的难题是来自查询的。根据客户需求的不一样,我们的DataGridView的样子可谓是千奇百怪,但是万变不离其宗,无论它怎么变化都不会逃离数据库和Datatable。而数据查询的关键就在于逻辑处理上,处理好数据间的逻辑,难题也就迎刃而解了。

    正文:

   

    第一小节:格式化显示数据(1)

   

 

    问题描述:

    在做项目的时候碰到了这样一个问题,数据库结构如下(Table1)

    col      A            B         C           D

    val      1            2          3           4

    界面显示结果

    A     1

    B     2

    C     3

    D    4

 

    大家不难看到,原本数据库中的列名变成了DataGridView中显示的数据。那么这个效果如何实现呢?

 

    思路解析:

    我们可以通过Select * from Table1得到数据表中所有的数据信息,同样我们也就得到了列名。那么,在界面中我们就通过对Datatable进行操作,将列名转换为我们的数据。

    在界面中我们新建一个Datatable,叫做DtShow。同样我们创建一个Datatable  DtSource用来接收从DAL层return回来的Datatable。这样,在BLL层中就出现了两个Datatable:DtShow(空的数据表)、DtSouce(存放着从DAL return来的信息)。

    1):对DtShow进行操作。

    在BLL层的它是一个空表,它既不包含列也不包含行。那么我们就先创建行。

    DtShow.Columns.Add("名称");

    DtShow.Columns.Add("值");

    这样,我们就在DtShow中添加了两列。接下来的任务就是怎么向里面添加数据了。

    2):在C#的逻辑处理中for是不可缺少的,不要忘记九九乘法表就是它完成的!呵呵。那么,在这个问题中我们就用用这个for,来解决我们的问题。

    3):首先,我们可以从DtSouce中提取到列名。其次,我们可以从DtSouce中得到列值。再次,就是将这些信息放入到DtShow里了。闲话少说,先看看代码再做解释。

            DataTable DtSource = DBConnect.ShowInfo();
            int colCount = DtSource .Columns.Count;
            int rowCount = DtSource .Rows.Count;
            //创建新表,用于存储格式转换后的数据
            DataTable DtShow = new DataTable();
            DtShow .Columns.Add("名称");
            DtShow .Columns.Add("值");
            for (int j = 0; j < rowCount; j++)
            {
                for (int i = 0; i < colCount; i++)
                {
                   
                        DataRow newRow = DtShow .NewRow();
                        //得到列名
                        string colname = DtSource .Columns[i].ToString();
                        //与列名对应的列值
                        string colValue = DtSource .Rows[j][i].ToString();

                        //赋值
                        newRow[0] = colname;
                        newRow[1] = colValue;

                        //添加行

                        DtShow .Rows.Add(newRow);
                
                }
             }

            dataGridView1.DataSource = DtShow;

    解释一下两个for循环的作用。从字义上将不难看出,第一个循环得到了表中第一行的所有信息,第二个循环得到了所对应的列信息。在第二次循环里,我们得到了列值,同样,列值对应的列名也就相应的找到了。这样,就可以把这一组信息放到新表的新行里面了。如此循环下去,就实现了上面所说的这个问题。如T1.

 

    但是我们会看到如果数据表里单单存在一行的时候看不出什么效果来,但是如果有两行以上的数据进行转换后,两组数据之间就没有间隔了。那么,如何解决这个问题呢?

    4):使用if语句将信息显示的更规则。代码如下:

     for (int j = 0; j < rowCount; j++)
            {
                for (int i = 0; i <= colCount; i++)
                {
                    if (i != colCount)
                    {
                        DataRow newRow = DtShow .NewRow();
                        //得到列名
                        string colname = DtSource .Columns[i].ToString();
                        //与列名对应的列值
                        string colValue = DtSource .Rows[j][i].ToString();

                        //赋值
                        newRow[0] = colname;
                        newRow[1] = colValue;

                        //添加行

                        DtShow .Rows.Add(newRow);
                    }else

                    {

                        newRow[0] = "";
                        newRow[1] = "";

                        newDt.Rows.Add(newRow);

                    }
                }
             }

            dataGridView1.DataSource = DtShow;

    这样就实现了分行的效果,如图T2.

 

    这一节就先这样,如果疑问请留言。

    最后说一句,在每写完一个句子都要保存一下,万一要是断电了,那就前功尽弃了,希望编程新手们多多注意!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值