无内容

解决方案 »

  1.   

    转自本版 LoveCherry的blog
    ---------------------如何利用DataGrid纵向显示数据? 
    有的时候想实现类似下图,第二个图示的效果: 我们可能首先会想到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 
      

  2.   

    SqlConnection conn=new SqlConnection("server=localhost;uid=sa;pwd=;database=pubs");
    conn.Open();
    string strSQL="SELECT au_lname FROM authors";
    DataRow drName;
    DataTable dtStuUsers=new DataTable("authors");
    DataSet dsStudent=new DataSet();
    dsStudent.Tables.Add(dtStuUsers);
    int intCount;
    intCount=Convert.ToInt32(txt1.Text);//选择或输入动态的列数
    SqlDataReader sdrStudent;
    SqlCommand cmdStudent;
    for(int i=0;i<intCount;i++)
    {
        //创建表中的列
        dtStuUsers.Columns.Add(new DataColumn("列"+i.ToString(),typeof(string)));
    }
        //打开数据集
        cmdStudent=new SqlCommand(strSQL,conn);
        sdrStudent=cmdStudent.ExecuteReader();
        //向内存表中添加数据
    while(sdrStudent.Read())
    {    drName=dtStuUsers.NewRow();
        for(int i=0;i<intCount;i++)
        {
            try
            {
                drName[i]=sdrStudent.GetString(0);
                if(i<intCount-1)
                {
                    sdrStudent.Read();
                }
            }
            catch(Exception)
            {
            }
        }
        dtStuUsers.Rows.Add(drName);
    }
    dgName.DataSource=dsStudent.Tables["authors"];
    dgName.DataBind();