2012-04-18 4 views
4

Я пытаюсь вручную добавить три заголовка в таблицу. Таблица прекрасно заполняет данные из SqlDataReader, но у меня возникли проблемы с тем, чтобы первая строка закрепилась.Только последняя ячейка добавляется в строку

 TableRow iRow = new TableRow(); 
     TableCell iCell = new TableCell(); 
     iCell.Text = "SUBMITTED BY"; 
     iRow.Cells.Add(iCell); 
     iCell.Text = "ON"; 
     iRow.Cells.Add(iCell); 
     iCell.Text = "ISSUE DESCRIPTION"; 
     iRow.Cells.Add(iCell); 
     table.Rows.Add(iRow); 

вызывает только последнюю запись, в данном случае ОПИСАНИЕ ВЫПУСКА, для отображения на столе. Я нашел обходное решение в

 TableRow iRow = new TableRow(); 
     TableCell iCell = new TableCell(); 
     TableCell iCell2 = new TableCell(); 
     TableCell iCell3 = new TableCell(); 
     iCell.Text = "SUBMITTED BY"; 
     iRow.Cells.Add(iCell); 
     iCell2.Text = "ON"; 
     iRow.Cells.Add(iCell2); 
     iCell3.Text = "ISSUE DESCRIPTION"; 
     iRow.Cells.Add(iCell3); 
     table.Rows.Add(iRow); 

, но это беспокоит меня, насколько беспорядочно это. Что-то не так с моей логикой, или есть что-то, чего я не вижу в C#? У меня неплохая ручка на C, но я начал C# пару недель назад.

Спасибо!

ответ

11

есть то, что я не хватает в C#

Похоже на то, да.

Это:

TableCell iCell = new TableCell(); 

создает TableCell объект, и присваивает ссылку к нему в переменную iCell. Значение iCell равно только Ссылка на объект. Это не сам объект. Это:

iRow.Cells.Add(iCell); 

передает, что ссылки методы Add. Это не передать объект Add - вы никогда не сможете сделать это на C#. Так что ваша строка заканчивается с большим количеством ссылок на одной и той же клетке, и все изменения, которые вы сделали в линии, как это:

iCell.Text = "ON"; 

просто перезаписывать друг друга, так как они вносят изменения в тот же объект.

Вы можете найти эти статьи полезно:

Лично я хотел бы изменить код, чтобы использовать коллекцию инициализаторами и объект инициализаторы:

TableRow row = new TableRow { 
    Cells = { 
     new TableCell { Text = "SUBMITTED BY" }, 
     new TableCell { Text = "ON" }, 
     new TableCell { Text = "ISSUE DESCRIPTION" }, 
    } 
}; 
6

Вы должны каждый раз воссоздавать iCell, иначе вы повторно добавляете один и тот же экземпляр снова и снова и просто меняете его текст. Так как они представляют собой один и тот же экземпляр, операция .Add(..) распознает это и не добавляет его снова, поэтому в конце кода остается только одна ячейка в строке - единственный экземпляр iCell.

Вот пример, который должен работать правильно:

TableRow iRow = new TableRow(); 
TableCell iCell = new TableCell(); 
iCell.Text = "SUBMITTED BY"; 
iRow.Cells.Add(iCell); 
iCell = new TableCell(); // create new cell 
iCell.Text = "ON"; 
iRow.Cells.Add(iCell); 
iCell = new TableCell(); // create new cell 
iCell.Text = "ISSUE DESCRIPTION"; 
iRow.Cells.Add(iCell); 
table.Rows.Add(iRow); 

Если вы хотите, чтобы сделать код немного чище, вы можете создать вспомогательный метод, который возвращает новый экземпляр ячейки с параметром заданного для текста:

public TableCell CreateCell(string text) { 
    TableCell iCell = new TableCell(); 
    iCell.Text = text; 
    return iCell; 
} 

Тогда ваш код может быть упрощена следующим образом:

TableRow iRow = new TableRow(); 
iRow.Cells.Add(CreateCell("SUBMITTED BY")); 
iRow.Cells.Add(CreateCell("ON")); 
iRow.Cells.Add(CreateCell("ISSUE DESCRIPTION")); 
table.Rows.Add(iRow);