有的時候想實作類別似,第二個圖示的效果:
我們可能首先會想到DataList,其實DataList我們這裡設定:
<asp:DataList id="DataList1" runat="server" RepeatColumns="10">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"test") %>
</ItemTemplate>
</asp:DataList>
這樣顯示出來的是的效果,並不能得到預期的縱向顯示一定行的效果。
其實遇到這樣的情況可以對資料來源做一下轉換。
比如我們建立這樣的測試資料來源:
DataTable dt=new DataTable();
DataColumn dc=new DataColumn("test",Type.GetType("System.String"));
dt.Columns.Add(dc);
for(int i=1;i<=54;i++)
{
DataRow dr=dt.NewRow();
dr["test"]="測試"+i;
dt.Rows.Add(dr);
}
資料表中有54行資料,我們希望它一列顯示8行,也就是分7列顯示,達到的效果,寫一個方法進行轉換。
private DataTable MakeData(DataTable dt,int iSize,int iColumnID)
{
int itmp=dt.Rows.Count%iSize;
int iColumn;
if(itmp==0)
iColumn=dt.Rows.Count/iSize;
else
iColumn=dt.Rows.Count/iSize+1;
DataTable newdt=new DataTable();
for(int i=0;i<iColumn;i++)
{
DataColumn dc=new DataColumn(dt.Columns[iColumnID].ColumnName+i,dt.Columns[iColumnID].DataType);
newdt.Columns.Add(dc);
}
for(int i=0;i<iSize;i++)
{
DataRow dr=newdt.NewRow();
for(int j=0;j<iColumn;j++)
{
if((i+j*iSize)<dt.Rows.Count)dr[dt.Columns[iColumnID].ColumnName+j]=dt.Rows[i+j*iSize][iColumnID];
}
newdt.Rows.Add(dr);
}
return newdt;
}
然後綁定即可:
this.DataGrid1.DataSource=MakeData(dt,8,0);
this.DataGrid1.DataBind();
在這裡僅僅說明一下這個方法三個參數的含義:
第一個參數傳遞一個原來的資料表進去
第二個參數表示希望這一列顯示多少行
第三個參數表示這個欄位是資料表的第幾列的欄位,這裡的資料表只有1列,所以寫0
其實這麼做的好處在於DataGrid能夠方便的進行分頁,這個排列次序接近於DataList的RepeatDirection="Vertical"效果
今天再來對上次的程式進行一下修改,實現RepeatDirection="Horizontal"的效果,同時啟用DataGrid的分頁。
這樣可以彌補DataList不能自動分頁的不足,但是效率上來說其實是很差的。