您好我有一个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()));
}
}
}
});
我不确定问题是什么。任何帮助将不胜感激。
由于
答案 0 :(得分: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()));
}
}
}
});
然而,现在又带来了另一个问题。返回的值没有按正确的顺序排序,换句话说,由于某种原因,最新的列表项被推到底部,它应该是顶部。其他值以正确的顺序显示。
任何人都有任何建议让它按正确顺序排序?非常感谢。
谢谢,
答案 1 :(得分:0)
我猜你想把所有的结果都放在一张桌子里?
在这种情况下,您需要确保仅宣布一次新的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
}