c#實現DataTable中行row、列Columns互換

來源:互聯網
上載者:User

今天在做Chart圖表時,發現客戶要求將資料列表顯示的格式與資料中的行,列是互換的,效果如下。其實,單純實現互換沒這麼麻煩,用不了這麼多for迴圈,但是,互換後datatable中會預設產生名為Columns1的名字,這是我們所不需要的,所以用了以下這程方法。Name、Sales是資料庫中的兩個實際欄位,能過互換後,DataTable的名稱也要做出相應的調整,因此加了一個判斷,這隻是實現的二種方法。希望朋友們有更好的解決方案,請告知,在此謝過。也希望這段代碼有點用。

方法一:上述圖中是將gridview的頭也綁定上了資料,自身帶有一定的樣式,可以在gridview中更改頭的樣式,如何你很懶那麼還是用第二種方法吧

/// <summary>
    /// DataTable行列轉換方法
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    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<rowCount;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<columnsCount;columnsi++)
            {
                DataRow dr=newDt.NewRow();
                for(int rowj=0;rowj<rowCount;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();
    }

最終結果:

 

         很多時候上網查資料,別人以前也曾經遇到過相同的問題,但在結貼時只說句“問題解決了”從不把解決辦法貼上來,還有就是資料中只有部分關鍵代碼,有些更關鍵的類或方法跟本沒有體現出來,造成不可用,我只是在這嘮叨下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.