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]填色
不知道怎么实现?递归?
求救!
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]填色
不知道怎么实现?递归?
求救!
按照你的要求,用DataList控件就能实现
每行设定一下你需要的纪录条数
然后会自动换行
{
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
}
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);
}
}
------说错了莫怪,别给分就是了。