2

I am having trouble displayin the values of list itmes in the proper order. The following are the fields in the list (with their actual system names):

-Title -Category -NominatedWon -Logo

The "Title" field contains year values eg, "2011", "2010", etc.

//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;



 //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()));
 }

 }
 }



 });

So the output for some reason seems to show the two latest lists items eg list item "2012", and list item "2011" are displayed at the bottom. In theory these should be displayed at the top followed by the rest of the list items.

Any sugestions on this will be greatly appreciated!

Thanks

Ptival
  • 9,167
  • 36
  • 53
Dev P
  • 1,157
  • 5
  • 32
  • 54

2 Answers2

8

There's nothing in your code to indicate the order, use something along the lines of:

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

SPQuery q = new SPQuery();
q.Query="<OrderBy><FieldRef Name='Title' /></OrderBy>";

SPListItemCollection listItemCollection = awardsList.Items.GetItems(q);   
Paul Leigh
  • 1,231
  • 7
  • 7
  • Thanks, Paul Leigh, for that solution! One quick note, though. To get it to work in my environment I had to take out the ".Items" before GetItems: SPListItemCollection listItemCollection = awardsList.GetItems(q); – user3868912 Jul 23 '14 at 13:11
  • 1
    SPListItemCollection listItemCollection = awardsList.GetItems(q); – Mehdi Souregi Nov 11 '15 at 10:45
0

Don't you have to use something like: listItemCollection.OrderBy(i=>i.Title).ThenBy(i=>i.Category).ThenBy(i=>i.NominatedWon).ThenBy(i=>i.Logo)

Hoss
  • 1
  • You do with LINQ to SharePoint, but the regular SharePoint OM only supports CAML queries as seen in Paul Leigh's answer. – AdamBT Apr 24 '14 at 15:31