请大家帮忙想想,我这个问题怎么解决。
.net中的数据显示方法 reapeater datalist datagrid方法都是比较规正的显示数据。
现在我要做的是一个不太规整的数据显示。
我给大家举个例子。
要显示的数据分3列
序号、名称、数据
其中序号,数据很好直接从数据库中直接读数据就可以了。
问题就是名字比较麻烦。它的数据也是在数据库中,但他是有分类的和没有分类的。
也就是说有的是直接一行。有的有分类的还要加上分类,分类在一起的要把分类放在一个
格中。大家可以想象得出来么。想想工资表格、复杂一点的报表之类的。
不能上传图片不太好描述。
请高手指点一下我,我下个星期就要交任务了。救命啊,我还没过试用期那!
有什么不明白的跟贴。
请高手、斑竹、前辈一定要帮助我啊,刚工作才1个月。希望大家多多指点一下。

解决方案 »

  1.   

    你的数据有3列,序号和数据列是两个端点比较好做,你主要做名称列,名称列的特点就是有分类和没有分类两种、有分类可能会有多层级的分类是吧,要先做排序,把一样的数据排在一起,先不考虑用什么控件去做显示,你的名称列可以看成是很多列,有一种层级分类的延伸就有一列,先实现这些,其它就是合并上下单元格了,如果你使用datalist datagrid控件就要,先将数据DataBind()上之后再做上下单元格的合并(这个没有把握),我常用的是在程序里形成html后打印到界面上。不知道对你有没有帮助。一点思路。
      

  2.   

    我初学.net。对你说的能够明白意思,但用程序实现我现在还不行,我的程序就是名字最多分2层。
    你说的方法很好,但是你说的合并单元格怎么实现??
      

  3.   

    用datagrid就可以。我做过用datagrid实现的比你这个复杂多了。有行列转换,有分类小计,分大类合计,而且列头不固定,显示列也不固定,大类小类数也不定,还有对表头,列头进行合并。不说那么多,反正很复杂也能实现。而且如果是比较复杂的报表还是自己写来的实在,因为别人的控件也考虑不了那么全面。象你这样的可以先把数据组织好再绑定到datagrid。你可以先把前两列取出到datatable,再增加一列,然后通过循环一行一行的加上数据。
    good luck
      

  4.   

    zhangyu028(天哪,这么多人) 
    你说的方法应该可行,可是我是初学者,你能解释的请出一点,给个实例么?
    这只是一个方面不会的,
    我的列有6列,序号、名称、代码、符号、数据、单位
    其中序号要自动编号(我实现了)
    名称、代码、符号、单位从sql sever数据库中得到。(也可以做到)
    数据这一列的值要到实时数据库中取得,这个我也不会,不知道怎么做。工程师之说了一句你写个接口。我才工作一个月让我做,实在是难为我啊。不过没有办法,现实中这样的是很平常,只有自己努力去做了,希望大家多多帮忙啊。
      

  5.   

    太长了。要发很多次,你留个mail我发给你。
      

  6.   

    lihbymr(netboy) ( ) 
    哪有163.com.cn的邮件服务器,给我退回来了。是163.com吧,我就按163.com发给你吧
      

  7.   

    嘿嘿不好意思哦,是163.com哎。谢谢先。我看看,不会的在请教你。
      

  8.   

    干脆象ASP一样自己写,呵呵!
      

  9.   

    ChengKing(bantamweight)
    你的方法能具体一点么?
      

  10.   

    正好 我也碰到过这种问题,我采用的办法是使用tabel控件,在后台读取数据进行判断,然后控制显示方式,比如添加行列 合并行列 下面是代码,是银行余额统计的
    for(int i=0;i<DTable1.Rows.Count;i++) 

    int CT=Convert.ToInt32(DTable1.Rows[i]["ct"]);
    string WN=DTable1.Rows[i]["working_name"].ToString();
    if(CT>1)
    {//生成一个店有多个银行帐户的表格
    TableRow r = new TableRow();
    r.HorizontalAlign=HorizontalAlign.Center;
    TableCell c = new TableCell();
    c.Text =WN;
    c.Width=120;
    c.RowSpan=CT+2;
    r.Cells.Add(c);
    Table1.Rows.Add(r);
    string sql="select account,rate,balance,dbalance,unaccount,bank_total from bank_balance where working_name='"+WN+"' and stat_date='"+dt.ToShortDateString()+"'";
    SqlDataReader reader=mydata1.executeQuery(sql);
    float BA,BA_T=0;float UN,UN_T=0; float TA,TA_T=0;float DZ,DZ_T=0;
    while(reader.Read())//该店的所有帐户
    {
    TableCell c1=new TableCell();
    c1.Text=reader["account"].ToString();
    c1.Width=200;
    r.Cells.Add(c1);//帐户
    TableCell c2=new TableCell();
    c2.Text=reader["rate"].ToString();
    c2.Width=55;
    r.Cells.Add(c2);//利率
    TableCell c3=new TableCell();
    BA=Convert.ToSingle(reader["balance"]);
    c3.Text=BA.ToString();
    r.Cells.Add(c3);//余额
    TableCell c4=new TableCell();
    UN=Convert.ToSingle(reader["unaccount"]);
    c4.Text=UN.ToString();
    c4.Width=110;
    r.Cells.Add(c4);//未达帐额
    TableCell c5=new TableCell();
    TA=Convert.ToSingle(reader["bank_total"]);
    c5.Text=TA.ToString();
    r.Cells.Add(c5);//总余额
     
    TableCell c6=new TableCell();
    DZ=Convert.ToSingle(reader["DBalance"]);
    c6.Text=DZ.ToString();
    c6.Width=110;
    r.Cells.Add(c6);//银行对帐单 BA_T=BA_T+BA;UN_T=UN_T+UN;TA_T=TA_T+TA;DZ_T=DZ_T+DZ;
    r=new TableRow();
    r.HorizontalAlign=HorizontalAlign.Center;
    Table1.Rows.Add(r);
    }
    reader.Close();
    //小计
    r=new TableRow();
    r.HorizontalAlign=HorizontalAlign.Center;
    Table1.Rows.Add(r);
    TableCell X1=new TableCell();
    X1.Text="小计";
    X1.ForeColor=Color.Red;
    X1.Width=200;
    r.Cells.Add(X1);//小计
    TableCell X2=new TableCell();
    X2.Text="";
    r.Cells.Add(X2);//利率
    TableCell X3=new TableCell();
    X3.Text=BA_T.ToString();
    r.Cells.Add(X3);//余额小计
    TableCell X4=new TableCell();
    X4.Text=UN_T.ToString();
    X4.Width=110;
    r.Cells.Add(X4);//未达帐额小计
    TableCell X5=new TableCell();
    X5.Text=TA_T.ToString();
    r.Cells.Add(X5);//总余额小计

    TableCell X6=new TableCell();
    X6.Text=DZ_T.ToString();
    r.Cells.Add(X6);//对帐单余额
    Table1.Rows.Add(r);
    }
    else if(CT==1)
    {
    string sql="select account,rate,balance,dbalance,unaccount,bank_total from bank_balance where working_name='"+WN+"' and stat_date='"+dt.ToShortDateString()+"'";
    SqlDataReader reader1=mydata1.executeQuery(sql);
    if(reader1.Read())
    {
    TableRow r = new TableRow();
    r.HorizontalAlign=HorizontalAlign.Center;
    TableCell c = new TableCell();
    c.Text =WN;
    c.Width=120;
    r.Cells.Add(c);
    TableCell c1 = new TableCell();
    c1.Text =reader1["account"].ToString();
    c1.Width=200;
    r.Cells.Add(c1);
    TableCell c2 = new TableCell();
    c2.Text =reader1["rate"].ToString();
    c2.Width=55;
    r.Cells.Add(c2);
    TableCell c3 = new TableCell();
    c3.Text =reader1["balance"].ToString();
    r.Cells.Add(c3);
    TableCell c4 = new TableCell();
    c4.Text =reader1["unaccount"].ToString();
    c4.Width=110;
    r.Cells.Add(c4);
    TableCell c5 = new TableCell();
    c5.Text =reader1["bank_total"].ToString();
    r.Cells.Add(c5); TableCell c6 = new TableCell();
    c6.Text =reader1["dbalance"].ToString();
    r.Cells.Add(c6);
    Table1.Rows.Add(r);
    }
    reader1.Close();
    }
    }
      

  11.   

    qsoo(求 索) 你有qq么,我想了解的细一点,我初学。所以很多问题不是很懂
      

  12.   

    跟dotnet无关,只是你的SQL SERVER不过关。学学存储过程,所需要的数据在存储过程中生成。可使用游标
      

  13.   

    个人建议:
       你是想说明,姓名是分类的是不是,读出来的时候,要根椐类别不同而读出不同姓名,是不是这个意思?我建议你再加一个例,这个例,当做是判别名字这个类的依据:    例如:
                序号   名称    数据    类别
                  1    张三     85       1
                  2    李四     96       2
                  3    赵五     45       3比如上面数据,你读的(名字)类数据,就可以根椐后面(类别)来作依据
                  比如类别一例中的1,你就可以把它当作一个类的标志,比如大类
                                  2 ,就可以当作另一个类,比如小类,
    当然3也是如此
                你读取数姓名列数据时,加个where 根据类别来读
                  select 姓名 from tablename where 类别=1  (或是2,3)             以上见意不知能不能帮得上你的忙!!!尽供参考,大家如有更好的意见,快快拿出来分享!!!                
      

  14.   

    正好我也遇到这个问题:
    private ASPNetDatagridDecorator m_add=new ASPNetDatagridDecorator();
    TableCell cell=null;
    m_add.DatagridToDecorate=ResultDataGrid;
    ArrayList header=new ArrayList(); cell=new TableCell();
    cell.Text="名称";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="型号";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="品牌";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="货币数量";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="价格说明";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="产地";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell); cell=new TableCell();
    cell.Text="适用行业";
    cell.RowSpan=2;
    cell.HorizontalAlign=HorizontalAlign.Center;
    header.Add(cell);
    主要代码如下:
    ASPNetDatagridDecorator m_add=new ASPNetDatagridDecorator();
      

  15.   

    ASPNetDatagridDecorator.cs代码:
    using System;
    using System.Web.UI.WebControls;
    using System.Collections;
    using System.Web.UI;namespace CBP.CBPWeb.Models
    {
              /// <summary>
             /// Summary description for ASPNetDatagridDecorator.
    /// </summary>
    public class ASPNetDatagridDecorator
    {
    public ASPNetDatagridDecorator()
    {
    //
    // TODO: Add constructor logic here
    //
    }
    public ASPNetDatagridDecorator(DataGrid DatagridToDecorate, ArrayList HeaderCells)
    {
    //
    // TODO: Add constructor logic here
    //
    this.DatagridToDecorate = DatagridToDecorate;
    AddMergeHeader(HeaderCells);
    }
    public void AddMergeHeader(ArrayList arrHeaderCells)
    {
    m_arrHeaderCells =arrHeaderCells;
    }
    private void NewRenderMethod(HtmlTextWriter writer, Control ctl)
    {
    int iCurrIndex = 0;
    for(int i=0; i<m_arrHeaderCells.Count; i++)
    {
    TableCell item = (TableCell)m_arrHeaderCells[i];
    if(item.ColumnSpan > 1)
    {
    iCurrIndex += item.ColumnSpan-1;
    }
    if(item.RowSpan > 1)
    {
    m_htblRowspanIndex.Add(iCurrIndex + i, iCurrIndex + i);
    }
    item.RenderControl(writer);
    }
    writer.WriteEndTag("TR");
    //*** Add the style attributes that was defined in design time
    //   to our second row so they both will have the same appearance
    m_dgDatagridToDecorate.HeaderStyle.AddAttributesToRender(writer);
    //*** Insert the second row
    writer.RenderBeginTag("TR");
    //*** Render all the cells that was defined in design time, except the last one
    //   because we already rendered it above
    for(int i=0; i< ctl.Controls.Count; i++)
    {
    if((null == m_htblRowspanIndex[i]))
    {
    ctl.Controls[i].RenderControl(writer);
    }
    }
    //*** We don't need to write the </TR> close tag because the writer will do that for us
    //   and so we're done :)
    }
    /// <summary>
    /// Gets or sets the datagrid to decorate
    /// </summary>
    public DataGrid DatagridToDecorate
    {
    get
    {
    return m_dgDatagridToDecorate;
    }
    set
    {
    if(null != m_dgDatagridToDecorate)
    {
    m_dgDatagridToDecorate.ItemCreated -= new DataGridItemEventHandler(DatagridToDecorate_ItemCreated);
    }
    m_dgDatagridToDecorate = value;
    m_dgDatagridToDecorate.ItemCreated += new DataGridItemEventHandler(DatagridToDecorate_ItemCreated);
    }
    }
    private void DatagridToDecorate_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    //*** Examine if the item created is the header item
    ListItemType lit = e.Item.ItemType;
    if(ListItemType.Header == lit)
    {
    //*** Redirect the default header rendering method to our own method
    e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMethod));
    }
    } /// <summary>
    /// Hold the reference to the datagrid to decorate
    /// </summary>
    private DataGrid m_dgDatagridToDecorate = null;
    private ArrayList m_arrHeaderCells = null;
    private Hashtable m_htblRowspanIndex = new Hashtable(); }
    }
      

  16.   

    回复人: kebeixueng(黑侠柯) ( ) 信誉:100 
    回复人: blackhero(黑侠客) ( ) 信誉:100