在ASP表中向下移动行的有效方法

时间:2015-12-07 21:53:05

标签: c# asp.net

我在程序中动态创建了一个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但是我省略了标题行。现在每一行都有一个按钮,如果可以的话,我想要它:

  1. 生成新行(这很容易,因为我可以使用上面的这个函数,rownum参数可以从按钮的ID中获取)
  2. 向下移动所有行,因此第n行将变为n + 1,新行将位于包含按下按钮的行的正下方。
  3. 如何有效地移动行?你做不到

    `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);
    

1 个答案:

答案 0 :(得分:1)

您可以使用.AddAt(...)函数插入特定索引。

tblTimesheet.Rows.AddAt(int index, TableRow row) 

只需将您的按钮的索引传递到上方:

tblTimesheet.Rows.AddAt(providedIndex, myNewTableRow)