(转载)c#、vb.net实现DataTable中行row、列Columns互换

原文出处:

https://www.cnblogs.com/mzoylee/archive/2009/04/23/1442484.html

 今天在做Chart图表时,发现客户要求将数据列表显示的格式与数据中的行,列是互换的,效果如下。其实,单纯实现互换没这么麻烦,用不了这么多for循环,但是,互换后datatable中会默认产生名为Columns1的名字,这是我们所不需要的,所以用了以下这程方法。Name、Sales是数据库中的两个实际字段,能过互换后,DataTable的名称也要做出相应的调整,因此加了一个判断,这只是实现的二种方法。希望朋友们有更好的解决方法,请告知,在此谢过。也希望这段代码有点用。

方法一:上述图中是将gridview的头也绑定上了数据,自身带有一定的样式,可以在gridview中更改头的样式,如何你很懒那么还是用第二种方法吧

///
    /// DataTable行列转换方法
    ///
    ///
    ///
    private DataTable ConvertRCDataTable(DataTable dt)
    {
        try
        {
            int rowCount = dt.Rows.Count+1;
            int columnsCount = dt.Columns.Count;
            DataTable newDt = new DataTable();
            DataColumn dc = new DataColumn();
      

            for(int rowi=0;rowi
            {
                if(rowi==0)
                {
                    if (dt.Columns[0].ToString() == "Name" || dt.Columns[0].ToString() == "Sales")
                    {
                        dt.Columns["Name"].ColumnName = "月份";
                        dt.Columns["Sales"].ColumnName = "价格";
                    }
                    
                    newDt.Columns.Add(dt.Columns[0].ToString());
                }
                else
                {
                    newDt.Columns.Add(dt.Rows[rowi-1][0].ToString());
                }
            }

            for(int columnsi=0;columnsi
            {
                DataRow dr=newDt.NewRow();
                for(int rowj=0;rowj
                {
                    if(rowj==0)
                    {
                        dr[rowj]=dt.Columns[columnsi].ToString();
                    }
                    else
                    {
                        dr[rowj]=dt.Rows[rowj-1][columnsi].ToString();
                    }
                }

                if(columnsi!=0)
                newDt.Rows.Add(dr);
            }
            return newDt;
        }
        catch(Exception ex)
        {
            throw new Exception(ex.ToString());
        }
    }

方法二:这种方法也可实现互换,但在方法中不能去除columns字的字段名字,需要将Gfidview的ShowHead属性设为False即可。

 public DataTable RevertDataTable(DataTable dt)
    {
        int dtColumnsNum = dt.Columns.Count;
        int dtRowsNum = dt.Rows.Count;
        DataTable dtRes = new DataTable("ndt");
        for(int i = 0; i<= dtRowsNum; i++)
        {

          if (dt.Columns[0].ToString() == "Name" || dt.Columns[0].ToString() == "Sales")
            {
                dt.Columns["Name"].ColumnName = "月份";
                dt.Columns["Sales"].ColumnName = "价格";
            }

            dtRes.Columns.Add("n"+(i+1));
        }
        for (int i = 0; i < dtColumnsNum; i++)
        {
            ArrayList a = new ArrayList(dtRowsNum+1);
            for (int j = 0; j <= dtRowsNum; j++)
            {
                if (j == 0)
                {
                    a.Add(dt.Columns[i].ColumnName.ToString());
                }
                else
                {
                    a.Add(dt.Rows[j-1][i].ToString());
                }
            }
            dtRes.Rows.Add(a.ToArray());
        }
        return dtRes;
    }

测试调用:

 protected void Page_Load(object sender, EventArgs e)
    {
        string fileNameString = this.MapPath(".");
        fileNameString +=  "//data//chartdata.mdb";

        string myConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileNameString;
        string mySelectQuery = "SELECT Name,Sales FROM REPS";
        OleDbConnection myConnection = new OleDbConnection(myConnectionString);
        myConnection.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(mySelectQuery, myConnection);
        DataSet ds = new DataSet();
        da.Fill(ds);
        DataTable dt = ds.Tables[0];
        DataRow dr = dt.NewRow();
        dt.Rows.Add(dr);
        GridView1.DataSource = dt;
        GridView1.DataBind();
        GridView2.DataSource = RevertDataTable(dt);
        GridView2.DataBind();
        myConnection.Close(); 
    }

最终结果:

vb.net写法:

方法一:

Private Function ConvertRCDataTable(ByVal dt As DataTable) As DataTable

        Try

            Dim rowCount As Integer = dt.Rows.Count + 1

            Dim columnsCount As Integer = dt.Columns.Count

            Dim newDt As DataTable = New DataTable()

            Dim dc As DataColumn = New DataColumn()



            For rowi As Integer = 0 To rowCount - 1



                If rowi = 0 Then



                    If dt.Columns(0).ToString() = "日期" Then

                        dt.Columns("日期").ColumnName = "数量"

                        'dt.Columns("Sales").ColumnName = "价格"

                    End If





                    newDt.Columns.Add(dt.Columns(0).ToString())

                Else

                    newDt.Columns.Add(dt.Rows(rowi - 1)(0).ToString())

                End If

            Next



            For columnsi As Integer = 0 To columnsCount - 1

                Dim dr As DataRow = newDt.NewRow()



                For rowj As Integer = 0 To rowCount - 1



                    If rowj = 0 Then

                        dr(rowj) = dt.Columns(columnsi).ToString()

                    Else

                        dr(rowj) = dt.Rows(rowj - 1)(columnsi).ToString()

                    End If

                Next



                If columnsi <> 0 Then newDt.Rows.Add(dr)

            Next



            Return newDt

        Catch ex As Exception

            Throw New Exception(ex.ToString())

        End Try

    End Function

方法二:

Public Function RevertDataTable(ByVal dt As DataTable) As DataTable

        Dim dtColumnsNum As Integer = dt.Columns.Count

        Dim dtRowsNum As Integer = dt.Rows.Count

        Dim dtRes As DataTable = New DataTable("ndt")



        For i As Integer = 0 To dtRowsNum



            'If dt.Columns(0).ToString() = "Name" OrElse dt.Columns(0).ToString() = "Sales" Then

            '    dt.Columns("Name").ColumnName = "月份"

            '    dt.Columns("Sales").ColumnName = "价格"

            'End If

            If dt.Columns(0).ToString() = "日期" Then

                dt.Columns("日期").ColumnName = "数量"

                'dt.Columns("Sales").ColumnName = "价格"

            End If



            dtRes.Columns.Add("n" & (i + 1))

        Next



        For i As Integer = 0 To dtColumnsNum - 1

            Dim a As ArrayList = New ArrayList(dtRowsNum + 1)



            For j As Integer = 0 To dtRowsNum



                If j = 0 Then

                    a.Add(dt.Columns(i).ColumnName.ToString())

                Else

                    a.Add(dt.Rows(j - 1)(i).ToString())

                End If

            Next



            dtRes.Rows.Add(a.ToArray())

        Next



        Return dtRes

 

    End Function

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值