【问题标题】:Reference controls (Table) dynamically in code behinde在后面的代码中动态引用控件(表)
【发布时间】:2016-08-21 20:09:51
【问题描述】:

我想知道是否可以用一个 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++;
}

我怎样才能拥有一种动态的TableName,这样我就不需要五次相同的代码了?

【问题讨论】:

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

标签: c# asp.net datatable


【解决方案1】:

另一种方法:

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 都应该“创建”一个表
  • 我从您的代码 ("(Table)this.FindControl(TABLENAME).Rows.Add(tRow)") 中假设表已经创建。
  • 好的。现在我明白了。第一个 DataRow 对应于 tbl0,第二个 datarow 对应于 tbl1,依此类推……对吧?还是我错过了什么?
  • 对!这就是它应该如何工作的。我不太擅长解释:/
  • 您应该考虑验证当前表的位置。如果 dtTable 有 10 行,您将收到错误消息,因为您没有表 [10]。查看我的编辑。
【解决方案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++;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2010-10-11
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多