今天在做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();
}
最終結果:
很多時候上網查資料,別人以前也曾經遇到過相同的問題,但在結貼時只說句“問題解決了”從不把解決辦法貼上來,還有就是資料中只有部分關鍵代碼,有些更關鍵的類或方法跟本沒有體現出來,造成不可用,我只是在這嘮叨下。