2009-06-26 9 views
3

Ich habe die Dokumente gelesen und spiele seit Tagen mit verschiedenen EventQuery-Parametern. Ich benutze C# .NET mit googles .net API, um die Ereignisse von einem öffentlichen Kalender zu erhalten, den ich einrichte. Ich kann die Veranstaltungen von der Api ganz gut bekommen, aber ich kann es nicht bekommen, um mir die nächsten kommenden Veranstaltungen nach Datum zu geben. Mein Kalender hat Wiederholungsereignisse mit einmaligen Ereignissen gemischt. Ich habe Sachen im Internet gelesen, um direkte Abfrageparameterzeichenfolgen in der Anforderungsuri zu verwenden, aber scheint nicht, richtig zu arbeiten, wenn es in der Netzapi-Struktur verwendet wird. Hier ist, was ich habe zur Zeit als meine Basis:.NET Google Kalender-API Ereignisse nach Datum sortieren

CalendarService myService = new CalendarService("testGoogleCalendar-1"); 
EventQuery myQuery = new EventQuery(); 
myQuery.Uri = new Uri(CalendarURI); 
myQuery.NumberToRetrieve = NumberOfEvents; 
EventFeed calFeed = myService.Query(myQuery); 
foreach (AtomEntry entry in calFeed.Entries) 
{ 
    LiteralControl test = new LiteralControl("<p><b>" + entry.Title.Text + "</b></p>"); 
    this.Controls.Add(test); 
}    

Ich habe versucht, mit der eventquery-Mitglieder spielen Startdatum, Startzeit, Endzeit, SortOrder, future und sogar versucht, den Zusatz „orderby = Startzeit?“ An das CalendarURI lokalen Mitglied.

Die API-Abfrage scheint die Reihenfolge des Veröffentlichungsdatums des Ereignisses zurückzugeben, bei dem ich das Ereignis im Kalender erstellt habe und nicht, wann das Ereignis stattfinden wird.

Ich habe auch versucht, nur das Datum und die Uhrzeit des Ereignisses aus dem AtomEntry-Objekt zu bekommen, damit ich es selbst sortieren und mit dem Titel in meiner Kontrolle formatieren kann, aber der einzige Ort, den ich sehe, ist in AtomEntry Inhalt. Inhalt, der auch andere Sachen hat, die ich nicht wirklich will. Gibt es ein DateTime-Mitglied für AtomEntry, damit ich das Datum abrufen kann?

Dieser hat mich wirklich verwirrt, so dass jede Hilfe geschätzt wird.

Antwort

4

Ich habe nicht die GData-Kalender-API von .NET verwendet, aber ich bin ziemlich vertraut mit Java. Die Startzeit eines Ereignisses hängt vom Typ eines Ereignisses ab. Ein wiederkehrendes Ereignis hat keine Startzeiten als solches, aber ein "einzelnes" Ereignis kann tatsächlich mehrere Male haben. Diese sind als <gd:when> Elemente gespeichert - das ist, was Sie suchen müssen.

Es sieht aus wie orderby=starttime wirklich sollte funktionieren. Es kann sich lohnen, WireShark oder etwas Ähnliches zu verwenden, um zu sehen, wie genau die Abfrage abläuft und die genauen Ergebnisse zurückkommen, um zu überprüfen, ob etwas in der API Probleme verursacht - insbesondere könnte dies nicht in der Uri-Eigenschaft verwendet werden aus irgendeinem Grund unterstützt ...

EDIT: Haben Sie versucht

query.ExtraParameters = "orderby=starttime"; 

Einstellung? Das ist wahrscheinlich der sicherste Weg, um es in die endgültige Abfrage uri zu bekommen ...

+0

Ich bemerkte in der Kalender-Demo-Code, der von Google kam, sie verwenden einen EventEntry anstelle eines AtomEntry, der ein Times-Mitglied vom Typ Wann hat. Aber ich habe damit gespielt und im Debugger-Modus haben alle meine Objekte ein Null Times-Member. Ich dachte wirklich, dass ich etwas hätte. Wenn ich die Raw-URI mit dieser Abfrage-Zeichenfolge in einem Browser ablegen, kommt es wieder in Ordnung, aber von den meisten zukünftigen Ereignis zu aktuellen sortiert. Sie schlagen einen anderen Parameter von sortorder = aufsteigend vor, aber das schraubt sogar den Browser-Test durcheinander. es scheint so viel Macht hier zu sein, aber jetzt Weg, es zu nutzen! danke ich werde weiter suchen –

+0

Eric - siehe meine Bearbeitung; Ich vermute, dass das Hinzufügen des zusätzlichen Parameters im rechten Bit der Abfragezeichenfolge der richtige Weg ist. Wenn Sie sagen, dass alle Ihre Objekte ein Null Times Mitglied hatten - waren das einzelne Ereignisse oder wiederholte? –

+0

Ich habe gerade Ihre Bearbeitung und IT WORKS !!! wenn ich über die extraparameter las, die sie machten, klang es wie meine kundenspezifischen Schlüsselwertpaare, die ich innerhalb des Kalenders speichern könnte. als Antwort auf Ihre single oder wiederkehrend habe ich für beide Typen überprüft und sie waren null. jetzt wäre es schön, die wiederkehrenden Ereignisse als einzelne Instanzen statt einer Gruppe angezeigt zu bekommen. ich muss es auch besser formatieren, da ich das Vorkommen datetime selbst nicht finden kann. Ich denke, für jetzt werde ich nur das Content-Mitglied analysieren und bekommen, was ich will. Danke Leute! –

0

Dies war auf der Google Docs für den Kalender API:

EventQuery myQuery = new EventQuery(feedUrl); 
myQuery.StartTime = new DateTime(2007, 1, 5); 
myQuery.EndTime = new DateTime(2007, 1, 7); 

EventFeed myResultsFeed = myService.Query(myQuery); 

Sie mehr darüber here lesen kann.

+0

Aber das sortiert die Ereignisse nicht nach Datum. Ja, es gibt Ihnen die Ereignisse innerhalb dieses Datums, aber sie sind in einer zufälligen Reihenfolge. Es würde mir gut gehen, wenn ich einen Weg finden könnte, das Ereignisdatum des Ereignisses zu bekommen und es selbst zu sortieren, wenn es sein muss. Danke –

+0

Ich muss Jon hier zustimmen, es scheint wie die orderby = StartTime sollte funktionieren. Hast du es versucht? – Kredns

+0

Ja und Nein; Ich habe es in einem Broswer-Test verwendet, der es an den Uri anbringt und es funktioniert, aber sortiert rückwärts. wenn ich es in die uri, die im api-code verwendet werden, einfügen, funktioniert es überhaupt nicht. Es gibt auch kein Mitglied für das EventQuery-Objekt für Orderby, aber es gibt ein Member im EventQuery-Objekt für SortOrder; aber das hilft mir auch nicht, da es nach Veröffentlichungsdatum oder etwas sortiert ist. –

4
myQuery.ExtraParameters = "orderby=starttime&sortorder=ascending"; 

wirkt wie ein Zauber!

+1

Dies, sowie die Verwendung des vollen Kalender-Feeds (ich hatte dummerweise versucht, auf Basic zuzugreifen) endete damit, meinen Sortierer zu lösen und die EventEntry.When-Sammlung zu füllen. – davewasthere

0

Um das Datum zu bekommen, habe ich so etwas mit einer Linq-Abfrage gemacht.

public static IEnumerable<EventDto> FindTopEvent(this AtomEntryCollection items, int cnt) 
{ 
    return (from item in items.OfType<EventEntry>() 
      select new EventDto 
      { 
       Url = item.FeedUri, 
       Title = item.Title.Text, 
       Date = item.Times[0].StartTime.ToShortDateString() 
      }).Take(cnt); 
} 

Wenn Sie wiederkehrende Ereignisse, die Sie brauchen können, betrachten so etwas wie dies zu tun:

Date = (item.Times.Count > 0) ? item.Times[0].StartTime.ToShortDateString() : "" 

Auch auf EventQuery zu true Ihre SingleEvent-Eigenschaft helfen.

0
EventQuery query = new EventQuery(); 
query.Uri = new Uri("https://www.google.com/calendar/feeds/" + this.Service.Credentials.Username + "/private/full"); 
query.ExtraParameters = "orderby=starttime&sortorder=ascending"; 
query.SingleEvents = true; 
query.StartTime = DateTime.Now; 
query.EndTime = DateTime.Now.AddDays(7.0); 

EventFeed calFeed = this.Service.Query(query); 

List<SyndicationItem> items = new List<SyndicationItem>(); 
foreach (var entry in calFeed.Entries) 
{ 
    EventEntry eventEntry = entry as Google.GData.Calendar.EventEntry; 
    if (eventEntry != null) 
    { 
     if (eventEntry.Times.Count != 0) 
     { 
     DateTime dt = eventEntry.Times[0].StartTime; 
    } 
} 

Arbeitete für mich.

0

Sie können auch sicherstellen, dass Sie kein abgebrochenes Ereignis erhalten, das auftreten kann, wenn Sie nur das erste Auftreten eines wiederkehrenden Ereignisses löschen und anschließend die verbleibenden Ereignisse in der Sequenz löschen. Diese verbleibenden Ereignisse in der Sequenz, die Sie gelöscht haben, wurden nicht wirklich gelöscht, sondern ihr Status wurde so eingestellt, dass sie im Hintergrund abgebrochen wurde.

Die einzige Möglichkeit, diese Ereignisse in Ihrem Code nicht zu lesen, wäre, die Status-Eigenschaft von EventEntry zu überprüfen.

1

Es ist vielleicht zu spät für die OP, aber ich habe diese Eigenschaft gefunden, die das Ergebnis sortieren. Es könnte vielleicht jemand helfen;)

var query = new EventQuery(FEED_URL);  
query.SortOrder = CalendarSortOrder.ascending;