Pergunta

Eu tenho lido a documentação e brincar com diferentes parâmetros EventQuery por dias agora. Eu estou usando C # .NET com api .net do Google para obter os eventos de um calendário público montei. Posso obter os eventos do api muito bem, mas eu não posso obtê-lo para me dar os próximos eventos por data. Meu calendário tem eventos de recorrência mistos com eventos one-shot. Eu li coisas na internet para usar cordas de parâmetros de consulta direta na URI pedido, mas não parece certo trabalho quando usá-lo na estrutura .net api. Aqui está o que eu tenho atualmente como minha base:

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

Eu tentei jogar com os membros do EventQuery StartDate, StartTime, EndTime, SortOrder, FutureEvents e até tentei adicionar "? Orderby = StartTime" para o membro local CalendarURI.

A consulta api parece retornar a ordem da data de publicação do evento que é quando eu criei o evento no calendário e não quando o evento vai ter lugar.

Eu também tentado obter apenas a data e hora do evento a partir do objeto AtomEntry para que eu possa classificar-me e formatá-lo com o título no meu controle, mas o único lugar que eu vejo é em Content.Content de AtomEntry que também tem outras coisas que eu realmente não quero. Existe um membro DateTime para AtomEntry para este para que eu possa apenas obter a data?

Este tem realmente me confundido agora, então qualquer ajuda é apreciada.

Foi útil?

Solução

Eu não usei o calendário API GData da NET, mas estou bastante familiarizado com ele em Java. A hora de início de um evento dependerá do tipo de um evento. Um evento recorrente não tem nenhum horários de início como tal, mas um evento "único" pode realmente ter várias vezes. Estes são armazenados como elementos <gd:when> -. Isso é o que você precisa olhar para

Ele se parece com orderby=starttime realmente deve trabalho embora. Pode valer a pena usar WireShark ou algo similar para ver a consulta exata sair e os resultados exatos voltando, para verificar que não é algo na API causando problemas - em particular, pode ser que o uso que na propriedade Uri não é suportado por alguma razão ...

EDIT: Você tentou definir

query.ExtraParameters = "orderby=starttime";

? Isso é provavelmente a maneira mais segura de obter-lo em consulta final uri ...

Outras dicas

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

funciona como um encanto!

É talvez tarde para o OP, mas eu encontrei esta propriedade desse tipo o resultado. Ele poderia talvez ajudar alguém;)

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

Este foi no Google Doc para a API do calendário:

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

EventFeed myResultsFeed = myService.Query(myQuery);

Você pode ler mais sobre isso aqui .

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

funcionou para mim.

Para obter a data eu fiz algo assim com uma consulta LINQ.

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

Se você tiver eventos recorrentes você pode precisar de olhar para fazer algo como isto:

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

Além disso, definir sua propriedade SingleEvent em EventQuery para true vai ajudar.

Você pode também querer ter certeza de que você não está recebendo um evento cancelado, o que você pode encontrar se você excluir apenas a primeira ocorrência de um evento recorrente e, em seguida, depois de eliminar os eventos restantes na seqüência. Estes eventos restantes na seqüência que você excluiu não foram realmente excluídos, em vez disso, seu status foi definido para cancelar nos bastidores.

A única maneira de não ler esses eventos em seu código seria verificar propriedade Status do EventEntry.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top