2009-06-10 1 views
4

zu bekommen versuchen Wenn ich versuche:SPList.GetItems (Ansicht) gibt eine Ausnahme, wenn Artikel Titel

using (SPWeb web = site.OpenWeb("/")) 
{ 
    SPList list = web.Lists["Blah"]; 
    SPView view = web.GetViewFromUrl("http://foo.com/Lists/Blah/View%20Name.aspx"); 

    foreach (SPListItem item in list.GetItems(view)) 
    { 
     writer.write(item.Title); 
    } 
} 

item.Title mir ein Argument bekommt.

Aber wenn ich

nur verwenden
foreach (SPListItem item in list.Items) 
{ 
    writer.write(item.Title); 
} 

Es funktioniert gut.

Was passiert hier? Was kann ich tun, um beim Übergeben einer Ansicht den Titel des Listenelements zu erhalten?

Antwort

9

Überprüfen Sie Ihre Sichtdefinition. Ist "Titel" eines der Felder in der Ansichtsdefinition?

In Ihrem ersten Code-Snippet filtern Sie Elemente aus Ihrer Liste basierend auf der Ansicht. Im zweiten Snippet greifen Sie direkt aus der Liste auf die Elemente zu, ohne zu filtern.

Als eine beiseite: looping on list.Items ist eine schlechte Idee. Leider führt die Implementierung dieser Eigenschaft in SharePoint dazu, dass Elemente für jede Iteration der Schleife aus der Datenbank abgerufen werden. Dieser Code ist bevorzugt und gleichwertig:

+0

Titel enthalten ist, und danke für den Zeiger auf Looping auf list.items. Auch wenn ich die AllItems-Ansicht verwende, bekomme ich immer noch die Ausnahme. – Slipfish

+1

Versuchen Sie, die AllItems-Ansicht zu ändern und alle Spalten in der Liste "Titel" anzukreuzen. Dies schließt alle Spalten ein, deren Namen in Klammern hinter ihnen stehen wie "Titel (Link zum Bearbeiten)". – dariom

+0

Das hat geholfen, danke. – Slipfish

1

Es ist Sharepooint Bug Verbindung mit GetItems von SPView-Objekt. Wenn Sie die Ansicht aus der Liste abrufen, beispielsweise: list.Views ["View Name"] ViewFields enthält nur zwei Felder (Title, LinkTitle) und die SPQuery für die abgerufene Ansicht ist leer. Wenn Sie Ihre Listenelemente filtern oder Felder über die SPQuery-Klasse abrufen möchten.

Auch möchten Sie Arbeitsstatus die GetItems (SPView) -Methode zu erhalten. Sie können HttpContext zurücksetzen und dann versuchen, spView zu bekommen.

Zum Beispiel:

private SPListItemCollection GetItemsByEventType() 
    { 
     HttpContextHelper.ResetCurrent(); 
     SPList list; 
     try 
     { 
      SPWeb web = Context.Site.OpenWeb(Context.Web.ID); 
      try 
      { 
       list = web.Lists[ListName]; 
      } 
      catch (Exception) 
      { 
       list = web.GetListFromUrl(ListName); 
      } 

      if (!String.IsNullOrEmpty(ListViewName)) 
      { 
       SPView view = list.Views.Cast<SPView>() 
        .Where(t => t.Title == ListViewName) 
        .FirstOrDefault(); 
       return list.GetItems(view); 
      } 
     } finally 
     { 
      HttpContextHelper.RestoreCurrent(); 
     } 

     return list.Items; 
    } 

    protected new SPContext Context 
    { 
     get { return SPContext.GetContext(base.Context); } 
    } 

public class HttpContextHelper 
{ 
    #region Fields 

    [ThreadStatic] 
    private static HttpContext _current; 

    #endregion 

    #region Methods 

    public static void ResetCurrent() 
    { 
     if (_current != null) 
     { 
      throw new InvalidOperationException(); 
     } 
     _current = HttpContext.Current; 
     HttpContext.Current = null; 
    } 

    public static void RestoreCurrent() 
    { 
     HttpContext.Current = _current; 
     _current = null; 
    } 

    #endregion 
} 
Verwandte Themen