Создание таблицы в коде позади

Привет, у меня есть веб-часть, в которой я создаю таблицу в коде для отображения значений элементов списка для списка «Награды» в таблице с двумя столбцами, где каждая награда отображается рядом в двух столбцах. Я использую цикл foreach, чтобы получить все значения элементов списка и в то же время создать таблицу.

Проблема в том, что по какой-то причине отображаются не все значения элементов списка. Также значения элементов списка повторяются в выводе. Ниже приведен фрагмент кода, который у меня есть:

using (SPSite site = new SPSite(webUrl))
{
using (SPWeb web = site.OpenWeb())
{

try
{

SPList awardsList = web.Lists["Awards"];

SPListItemCollection listItemCollection = awardsList.Items;

int modCounter = 0;
foreach (SPListItem oListItem in listItemCollection)
{
modCounter += 1;

awardYear = oListItem["Year"].ToString();
awardCategory = oListItem["Category"].ToString();
awardNomWon = oListItem["NominatedWon"].ToString();
awardLogo = oListItem["Logo"].ToString(); //need to fingure out how to display images

Table tbl = new Table();
TableRow tblRow = new TableRow();
TableCell tblCellLeft = new TableCell(); //for the awards in the first column
TableCell tblCellRight = new TableCell(); //for the awards in the second column

tblCellLeft.VerticalAlign = VerticalAlign.Top;
tblCellLeft.HorizontalAlign = HorizontalAlign.Center;
tblCellLeft.CssClass = ("style5");

tblCellRight.VerticalAlign = VerticalAlign.Top;
tblCellRight.HorizontalAlign = HorizontalAlign.Center;


//values for the left column
tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style1\">" + awardYear +
"</div>"));

tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style2\">" + awardCategory + 
"</div>"));

tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style3\">" + awardNomWon + 
"</div>"));

//Values for the right column
tblCellRight.Controls.Add(new LiteralControl("<div class=\"style1\">" + awardYear + 
"</div>"));

tblCellRight.Controls.Add(new LiteralControl("<div class=\"style2\">" + awardCategory 
+ "</div>"));

tblCellRight.Controls.Add(new LiteralControl("<div class=\"style3\">" + awardNomWon + 
"</div>"));

tblCellRight.Controls.Add(new LiteralControl("<div class=\"style4\">" + "<img src=" + 
awardLogo.Replace(",", "") + "</div>"));

//adding Rows
tblRow.Cells.Add(tblCellLeft);
tblRow.Cells.Add(tblCellRight);
tbl.Rows.Add(tblRow);

if (modCounter % 2 == 0)
{                            
//values from tblCellLeft
PlaceHolder6.Controls.Add(tbl);
}
else
{
//values from the tblRightCell
PlaceHolder2.Controls.Add(tbl);
}

}

}
catch (Exception err)
{
PlaceHolder3.Controls.Add(new LiteralControl(err.ToString()));
}

}
}


});

Я не уверен, в чем проблема. Любая помощь будет принята с благодарностью.

Спасибо


person Dev P    schedule 16.01.2012    source источник


Ответы (2)


Мне удалось решить эту проблему, используя цикл for следующим образом:

//getting the awards list and extracting correct values from the necesary fields
//asp running with elevated privilegs
SPSecurity.RunWithElevatedPrivileges(delegate()
{

using (SPSite site = new SPSite(webUrl))
{
using (SPWeb web = site.OpenWeb())
{



try
{

SPList awardsList = web.Lists["Awards"];

SPListItemCollection listItemCollection = awardsList.Items;


//getting all list items and displaying them next to each other row by row


//int modCounter = 0;

//Creating the table
Table tbl = new Table();

//foreach (SPListItem oListItem in listItemCollection)
int x = listItemCollectionI.Count;
for(int i = 0; (i * 2) < x; i++) // divide total item collection by two, each loop 
iteration, add two awards to a row (left cell, right cell)
{
// get listItemCollection[i];
//Create table rows, table cells

int leftIndexer = i * 2;
int rightIndexer = (i * 2) + 1;

if (leftIndexer == x)
{
break;
}                                

TableRow tblRow = new TableRow();
TableCell tblCellLeft = new TableCell(); //for the awards in the first column
TableCell tblCellRight = new TableCell(); //for the awards in the second column

tblCellLeft.VerticalAlign = VerticalAlign.Top;
tblCellLeft.HorizontalAlign = HorizontalAlign.Center;
tblCellLeft.CssClass = ("style5");

tblCellRight.VerticalAlign = VerticalAlign.Top;
tblCellRight.HorizontalAlign = HorizontalAlign.Center;


// get the values
awardYear = listItemCollection[leftIndexer]["Title"].ToString();
awardCategory = listItemCollection[leftIndexer]["Category"].ToString();
awardNomWon = listItemCollection[leftIndexer]["NominatedWon"].ToString();
if(listItemCollection[leftIndexer]["Logo"] != null)
awardLogo = (string)listItemCollection[leftIndexer]["Logo"];

// add to left cell
//values for the left column
tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style1\">" + awardYear + 
"</div>"));
tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style2\">" + awardCategory + 
"</div>"));
tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style3\">" + awardNomWon + 
"</div>"));
tblCellLeft.Controls.Add(new LiteralControl("<div class=\"style4\">" + "<img src=" + 
awardLogo.Replace(",", "") + "</div>"));

// add left cell to row
tblRow.Cells.Add(tblCellLeft);

if (rightIndexer < x) // if this item exists in the collection (prevent bug with odd 
number of awards)
{


// get the values
awardYear = listItemCollection[rightIndexer]["Title"].ToString();
awardCategory = listItemCollection[rightIndexer]["Category"].ToString();
awardNomWon = listItemCollection[rightIndexer]["NominatedWon"].ToString();

if (listItemCollection[rightIndexer]["Logo"] != null)
    awardLogo = (string)listItemCollection[rightIndexer]["Logo"];


// add to right cell
//Values for the right column
tblCellRight.Controls.Add(new LiteralControl("<div class=\"style1\">" + awardYear + 
"</div>"));
tblCellRight.Controls.Add(new LiteralControl("<div class=\"style2\">" + awardCategory 
+ "</div>"));
tblCellRight.Controls.Add(new LiteralControl("<div class=\"style3\">" + awardNomWon + 
"</div>"));
tblCellRight.Controls.Add(new LiteralControl("<div class=\"style4\">" + "<img src=" + 
awardLogo.Replace(",", "") + "</div>"));

//add right cell to row
tblRow.Cells.Add(tblCellRight);

}

// add row to table
tbl.Rows.Add(tblRow);

}

PlaceHolder6.Controls.Add(tbl); // add table outside of loop 
}
catch (Exception err)
{
PlaceHolder3.Controls.Add(new LiteralControl(err.ToString()));
}

}
}



});

Однако это теперь приносит другую проблему. Возвращаемые значения не сортируются в правильном порядке, другими словами, по какой-то причине последний элемент списка перемещается вниз, где он должен быть вверху. Остальные значения отображаются в правильном порядке.

У кого-нибудь есть какие-либо предложения, чтобы отсортировать это в правильном порядке? Это будет высоко оценено.

Спасибо,

person Dev P    schedule 17.01.2012
comment
Теперь это исправлено, используя следующий запрос caml для сортировки: SPList awardsList = web.Lists[Awards]; SPQuery q = новый SPQuery(); q.Query=‹OrderBy›‹FieldRef Name='Title' /›‹/OrderBy›; SPListItemCollection listItemCollection = awardsList.Items.GetItems(q); - person Dev P; 17.01.2012

Я предполагаю, что вы хотите, чтобы все ваши результаты были в одной таблице?

В этом случае вы хотите убедиться, что вы объявляете новый Table только один раз. Для этого объявите свою таблицу до начала цикла foreach.

Table tbl = new Table(); 
foreach (SPListItem oListItem in listItemCollection) 
{
   // get data
   // create cells & rows
   // insert data into cells, cells into rows, and rows into table
}
person Brissles    schedule 16.01.2012
comment
Я получаю тот же результат. По сути, было бы идеально, если бы каждая награда отображалась рядом, когда она повторяется в цикле. Еще не удалось решить эту проблему, она интересная, но она должна быть такой простой - person Dev P; 17.01.2012
comment
Не могли бы вы уточнить «не все значения элементов списка отображаются»? Кроме того, какой вывод вы получаете, когда просто делаете что-то вроде: Console.WriteLine(oListItem[Year].ToString()) для каждого oListItem? Это был бы простой способ определить, действительно ли коллекция заполнена так, как вы ожидаете. - person Brissles; 17.01.2012
comment
Конечно, у меня есть 11 элементов в списке, но возвращаются только 8. Также они повторяются. Я получаю значения при использовании Console.WriteLine(oListItem[Year].ToString()), что странно. - person Dev P; 17.01.2012
comment
пытаясь посмотреть, можно ли это сделать с помощью более простого цикла. С надеждой - person Dev P; 17.01.2012
comment
Я бы предположил, что это как-то связано с тем, как вы строите свою таблицу или как вы добавляете ее в свой PlaceHolder. Попробуйте добавить ‹div id=my_div runat=server/› на свою страницу и добавить в него таблицы без условия модификации. Посмотрите, отобразятся ли все 11 таблиц первыми, и работайте с ними. - person Brissles; 17.01.2012