数组复制在循环中失败

时间:2010-10-05 13:41:38

标签: c# arrays

简化问题:

我想使用以下内容动态构建html表。

   //table.Rows[row].Cells.AddRange(new TableCell[] { new TableCell(), new TableCell(), new TableCell(), new TableCell(), new TableCell(), new TableCell() });


for (int row = 0; row < intRows; row++)
{
    table.Rows.Add(new TableRow());
    table.Rows[row].Cells.AddRange(new TableCell[intCellsPerRow]);
    intTableRows = row;

}

之前我使用过注释行,但它不灵活,所以不是我想要的。

行:table.Rows[row].Cells.AddRange(new TableCell[intCellsPerRow]);不起作用。

我怎样才能让它发挥作用?

回答 感谢Heinzi

  for (int row = 0; row < dtStructure.Rows.Count / TABLE_COLUMNS; row++)
            {

                table.Rows.Add(new TableRow());

                for (int i = 0; i < CELLS_PER_COLUMN * TABLE_COLUMNS; i++)
                {
                    table.Rows[row].Cells.Add(new TableCell());
                }

                intTableRows = row;
            }

3 个答案:

答案 0 :(得分:2)

您要将相同的单元格添加到所有行。这就是:第一次迭代后,您创建的(CELLS_PER_COLUMN * TABLE_COLUMNS)单元格将第一行作为其父级。在第二次迭代之后,他们的父级将更改为第二行等。最后,它们都会在最后一行结束。请注意,ToArray 复制单元格,它只是将引用复制到单元格中的新数组。因此,所有行都尝试共享相同的单元格,这些单元格不起作用(WebControl,例如TableCell只能有一个父级。)

对于每一行,您需要创建 new 单元格。我假设你想要这样的东西:

for (int row = 0; row < datatable.Rows.Count / 6; row++)
{
    table.Rows.Add(new TableRow());
    for (int i = 0; i < CELLS_PER_COLUMN * TABLE_COLUMNS; i++)
    {
        table.Rows[row].Cells.Add(new TableCell());
    }
}

未经测试,因为我现在没有Visual Studio,但你应该明白这个想法......

编辑:我刚看到你编辑了你的问题。你的行

table.Rows[row].Cells.AddRange(new TableCell[intCellsPerRow]);

不起作用,因为在这里添加{em>空数组的intCellsPerRow表格单元格,即您的数组包含{null, null, ...}。您需要使用上面的代码示例中的new创建每个单元格。

答案 1 :(得分:1)

您的for循环使用名为datatable的变量作为约束。但在你的街区内, 您将行添加到名为table的变量中。这些都一样吗?

for (int row = 0; row < datatable.Rows.Count / 6; row++)  
{  
    TableCell[] arrCells = lCells.ToArray<TableCell>();  

    table.Rows.Add(new TableRow());  
    // Snip for brevity
}

好奇:/ 6有什么用?如果您只是想按顺序将行放入表中,为什么还需要为每第6行执行此操作?

答案 2 :(得分:0)

这不是最有效的,但我的懒惰会这样写:

table.Rows[row].Cells.AddRange(
  new TableCell[intCellsPerRow].Select(c=>new TableCell()).ToArray());