在代码后端动态引用控件(表格)

4

我想知道是否可以使用一个foreach填充不同的表格。

我有5个表格:tbl0,tbl1,tbl2,tbl3,tbl4,目前我每个表格都使用下面的代码一次。

//fill *dtTable* with SQL

foreach (DataRow dr in dtTable.Rows)
{         
   TableHeaderRow tHRow = new TableHeaderRow();
   TableHeaderCell tHeader = new TableHeaderCell();
   tHeader.Text = dr.Field<string>("Loc");
   tHRow.Cells.Add(tHeader);
   tbl0.Rows.Add(tHRow);

   //fill 'hl' with sql

   tCell.Controls.Add(hl);
   tRow.Controls.Add(tCell);
   tbl0.Rows.Add(tRow);
}

我想到了类似这样的内容:

 //fill *dtTable* with SQL    

 int i = 0;
 foreach (DataRow dr in dtTable.Rows)
 {         
    string TABLENAME = "tbl"+i; 

    TableHeaderRow tHRow = new TableHeaderRow();
    TableHeaderCell tHeader = new TableHeaderCell();
    tHeader.Text = dr.Field<string>("Loc");
    tHRow.Cells.Add(tHeader);

    (Table)this.FindControl(TABLENAME).Rows.Add(tHRow); // does not funktion, just an idea

    //fill 'hl' with sql

    tCell.Controls.Add(hl);
    tRow.Controls.Add(tCell);

    (Table)this.FindControl(TABLENAME).Rows.Add(tRow); // does not funktion, just an idea
    i++;
}

如何拥有一种动态的表名,以便我不需要重复编写五次相同的代码?


foreach做这个可能会有点笨拙。你为什么要避免使用for循环?我假设每个表都有相同的行数。 - AntiTcb
每个表都可以有不同数量的行,每个 DataRow 创建一个表。 - MaxW
2个回答

3

另一种方法:

int i = 0;
var tables = new List<Table>();
tables.Add(tbl0);
tables.Add(tbl1);
tables.Add(tbl2);
tables.Add(tbl3);
tables.Add(tbl4);


foreach (DataRow dr in dtTable.Rows)
{   
    // validation
   if(i>tables.Count)
   {
      return;
   }

   var tbl in tables[i];
   TableHeaderRow tHRow = new TableHeaderRow();
   TableHeaderCell tHeader = new TableHeaderCell();
   tHeader.Text = dr.Field<string>("Loc");
   tHRow.Cells.Add(tHeader);

   tbl.Rows.Add(tHRow);

   //fill 'hl' with sql

   tCell.Controls.Add(hl);
   tRow.Controls.Add(tCell);

   tbl.Rows.Add(tRow);
   i++;
}

我不喜欢使用(Table)this.FindControl(TABLENAME).Rows.Add(tRow);,因为将来你可能会更改表的ID,因此还必须更改函数。


这样行不通,foreach 中的每个 DataRow 应该“创建”一个表。 - MaxW
我从你的代码中推断出(“(Table)this.FindControl(TABLENAME).Rows.Add(tRow)”),表已经被创建了。 - POIR
好的,现在我明白了。第一个DataRow对应tbl0,第二个DataRow对应tbl1,以此类推... 对吗?还是我漏掉了什么? - POIR
对的!就应该是这样的。我不擅长解释 :/ - MaxW
那么您应该考虑验证当前表的位置。如果dtTable有10行,则会出现错误,因为您没有tables [10]。请参阅我的编辑。 - POIR

2

确保您不需要重复编写相同代码的一种可能的方法是遍历您所有的表格。

foreach (var table in new [] {tbl0, tbl1, tbl2, tbl3, tbl4}) {
    foreach (DataRow dr in table.Rows) {         
        string TABLENAME = "tbl"+i; 

        TableHeaderRow tHRow = new TableHeaderRow();
        TableHeaderCell tHeader = new TableHeaderCell();
        tHeader.Text = dr.Field<string>("Loc");
        tHRow.Cells.Add(tHeader);

        (Table)this.FindControl(TABLENAME).Rows.Add(tHRow);

        //fill 'hl' with sql

        tCell.Controls.Add(hl);
        tRow.Controls.Add(tCell);

        (Table)this.FindControl(TABLENAME).Rows.Add(tRow);
        i++;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接