我在程序中动态创建了一个ASP表:
<asp:Table ID="tblTimesheet" runat="server" style="width: 100%;">
<asp:TableHeaderRow> .... </asp:TableHeaderRow>
... </asp"Table>
使用此类函数生成行:
protected TableRow GenerateRow(int rownum)
{
TableRow row = new TableRow();
TextBox tbWorked= new TextBox();
tbWorked.ID= "tbWorked+.rownum.ToString();
Label lblDay = new Label();
lblDay.ID= "lblDay"+rownnum.ToString();
...
TableCell Cell0 = new TableCell();
Cell0.Controls.Add(tbWorked);
TableCell Cell1 = new TableCell();
Cell1.Controls.Add (lblDay);
...
row.Cells.Add(Cell0);
row.Cells.Add(Cell1);
...
return row
};
正如您所看到的,每行都有许多不同类型的控件,每个控件都命名为controlname+rowNumber.ToString();
所以第6行中的标签lblDay
将是lblDay6
(是的,我知道行是从0但是我省略了标题行。现在每一行都有一个按钮,如果可以的话,我想要它:
rownum
参数可以从按钮的ID中获取)如何有效地移动行?你做不到
`tblTimesheet.Rows[n] = blTimesheet.Rows[n-1]
明显的解决方案是按名称进行控制
private void ReindexTable (int rowNum)
{
int maxrows = tblTimesheet.Rows.Count;
TableRow newRow = GenerateRow(maxrows+1);
tblTimesheet.Rows.Add(newRow);
for (int x= maxrows+1; x>rowNum; x--)
{
Label lblDaySource = tblTimesheet.FindControl("lblDay"+(x-1).ToString());
label lblDayDest = tblTimesheet.FindControl("lblDay" +x.ToString());
lblDayDest.Text = lblDaySource.Text
....
等所有其他控件类型,但这种方法看起来非常......不优雅。
有更好的方法吗?
编辑:@Eric飞利浦回答指出我正确的方向private void ReindexTable (int rowNum)
{
int maxrows = tblTimesheet.Rows.Count;
TableRow newRow = GenerateRow(maxrows+1);
for (int x=maxrows; x>rowNum; x--)
{
TablerRow rowx = tblTimesheet.Rows[x-1];
tblTimesheet.Rows.AddAt(x,rowx);
}
tblTimesheet.Rows.addAt(rownum,newRow);
答案 0 :(得分:1)
您可以使用.AddAt(...)
函数插入特定索引。
tblTimesheet.Rows.AddAt(int index, TableRow row)
只需将您的按钮的索引传递到上方:
tblTimesheet.Rows.AddAt(providedIndex, myNewTableRow)