1

嗨,我有一个 webpart,我在后面的代码中创建了一个表格,以在两个列中显示“奖项”列表的列表项的值,其中每个奖项在两个列中并排显示。我正在使用 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()));
}

}
}


});

我不确定问题是什么。任何帮助将不胜感激。

谢谢

4

2 回答 2

1

我已经设法通过使用 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()));
}

}
}



});

然而,这现在带来了另一个问题。返回的值没有按正确的顺序排序,换句话说,由于某种原因,最新的列表项被推到应该在顶部的底部。其他值以正确的顺序显示。

有人有什么建议可以按正确的顺序排序吗?将不胜感激。

谢谢,

于 2012-01-17T10:39:16.517 回答
0

我猜你想把所有结果都放在一张桌子上?

在这种情况下,您要确保只声明一个新的Table once。为此,请在开始循环之前声明您的表。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
}
于 2012-01-16T19:09:18.130 回答