DataTable结构:
ID:int
Start:int
End:intTable:头
----------------------------------------------------
|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|
----------------------------------------------------现有数据:
ID   Start   End
1      2       5     [2,3,4,5格填上颜色]
2      10      15    [10-15格填上颜色]
3      12      14    [12-14格填上颜色]如果每条记录画一行,那就太没有挑战性了。
要求:要用最少行将数据显示在Table中。也就是一行已经满了,才能创建新的一行。并且不能重叠!
上面的数据就会画成:第一行[2-5]和[10-15]填色
                    第二行[12-14]填色
不知道怎么实现?递归?
求救!

解决方案 »

  1.   

    什么样才算满呢?
    按照你的要求,用DataList控件就能实现
    每行设定一下你需要的纪录条数
    然后会自动换行
      

  2.   

    private void mytest()
    {
    DataTable temp = new DataTable("temp");
    temp.Columns.Add("f1");
    temp.Columns.Add("f2");
    temp.Columns.Add("f3");
    temp.Columns.Add("f4");
    temp.Columns.Add("f5");
    temp.Columns.Add("f6");
    temp.Columns.Add("f7");
    temp.Columns.Add("f8");
    temp.Columns.Add("f9");
    temp.Columns.Add("f10");
    temp.Columns.Add("f11");
    temp.Columns.Add("f12");
    temp.Columns.Add("f13");
    temp.Columns.Add("f14");
    temp.Columns.Add("f15");
    temp.Columns.Add("f16");
    temp.Columns.Add("f17");
    temp.Columns.Add("f18");
    temp.Columns.Add("f19");
    temp.Columns.Add("f20");
    //为当前绑定的数据表添加新行
    DataRow myrow = temp.NewRow();
    myrow["f1"] = "";
    myrow["f2"] = "";
    myrow["f3"] = "";
    myrow["f4"] = "";
    myrow["f5"] = "";
    myrow["f6"] = "";
    myrow["f7"] = "";
    myrow["f8"] = "";
    myrow["f9"] = "";
    myrow["f10"] = "";
    myrow["f11"] = "";
    myrow["f12"] = "";
    myrow["f13"] = "";
    myrow["f14"] = "";
    myrow["f15"] = "";
    myrow["f16"] = "";
    myrow["f17"] = "";
    myrow["f18"] = "";
    myrow["f19"] = "";
    myrow["f20"] = "";
    temp.Rows.Add(myrow);


    DataTable testtable = new DataTable();//这是已经带数据的表
    int intcols = 0;//等于20表示一行已经满了
    int introws = 0;//当前是第几行。
    int intStart, intEnd;
    foreach(DataRow row in testtable.Rows )
    {
    intStart = int.Parse(row["Start"].ToString());
    intEnd = int.Parse(row["End"].ToString());
    for(int i=intStart;i<intEnd+1;i++)
    {
    if(""==temp.Rows[introws][i.ToString( )].ToString() )//当前行的此格还为空
    {
    temp.Rows[introws][i.ToString()] = i.ToString( );//赋颜色值
    intcols++;
    }
    //else{}
    if(intcols>=20)//此行已经满了
    {
    introws++;
    intcols = 0;
    myrow = temp.NewRow();
    myrow["f1"] = "";
    myrow["f2"] = "";
    myrow["f3"] = "";
    myrow["f4"] = "";
    myrow["f5"] = "";
    myrow["f6"] = "";
    myrow["f7"] = "";
    myrow["f8"] = "";
    myrow["f9"] = "";
    myrow["f10"] = "";
    myrow["f11"] = "";
    myrow["f12"] = "";
    myrow["f13"] = "";
    myrow["f14"] = "";
    myrow["f15"] = "";
    myrow["f16"] = "";
    myrow["f17"] = "";
    myrow["f18"] = "";
    myrow["f19"] = "";
    myrow["f20"] = "";
    temp.Rows.Add(myrow);
    break;
    }
    }
    }
    //表temp就是结果,根据它再画Table

    }
      

  3.   

    用递归. DataTable dt = new DataTable();
    dt.Columns.Add("Start",typeof(int));
    dt.Columns.Add("End",typeof(int));
    dt.Columns.Add("flag",typeof(int)); //是否已经画过了.
    DataRow row = dt.NewRow();
    row[0] = 2;
    row[1] = 5;
    row[2] = 0;

    dt.Rows.Add(row);

    row = dt.NewRow();
    row[0] = 10;
    row[1] = 15;
    row[2] = 0;
    dt.Rows.Add(row);

    row = dt.NewRow();
    row[0] = 12;
    row[1] = 14;
    row[2] = 0;
    dt.Rows.Add(row);
    row = dt.NewRow();
    row[0] = 3;
    row[1] = 8;
    row[2] = 0;
    dt.Rows.Add(row);

    row = dt.NewRow();
    row[0] = 17;
    row[1] = 20;
    row[2] = 0;
    dt.Rows.Add(row);

    Table t = new Table();
    DataView dv = dt.DefaultView;
    dv.Sort = "Start";
    this.DrawTable(ref t,  dv);

    this.Controls.Add(t);
    void DrawTable (ref Table t,  DataView dv)
    {
    TableRow tr = new TableRow();
    for(int i=0;i<20;i++)
    {
    tr.Cells.Add(new TableCell());
    tr.Cells[tr.Cells.Count-1].Text = (i+1).ToString();
    }
    t.Rows.Add(tr); dv.RowFilter = "flag = 0 ";
    dv.Sort = "start";
    int iCurPos =  0 ; 
    for(int i=0;i<dv.Count;i++)
    {
    int i1 = (int)dv[i]["Start"];
    int i2 = (int)dv[i]["End"];
    if(i1> iCurPos && i2 <=20 )
    {
    for(int j=i1;j<i2+1;j++)
    {
    tr.Cells[j-1].BackColor = Color.Red;
    }
    iCurPos = i2 ;
    dv[i].Row["flag"] = 1;
    i-- ;//dv的行减少了.
    }
    else if(i2>= 20) //必须换行了.
    {
    this.DrawTable(ref t,dv);
    }   } if(dv.Count>0) //未处理完.
    {
    this.DrawTable(ref t,dv);
    }
    }
    ------说错了莫怪,别给分就是了。
      

  4.   

    这么复杂,就不要用Table类型的控件化了,创建Rows和Cells,改变属性,效率多低!你自己封装一个专门负责此事的控件吧,不难的,任何一本涉及一点点高级话题的ASP.NET书籍都会谈及控件设计,无非就是用HtmlTextWriter来输出HTML。