2010-09-30 3 views
4

мне нужно, чтобы иметь возможность построить события на вертикальной шкале и мне нравится, как Google Calendar достигает этой цели:Как я могу представить серию событий, таких как календарь Google?

Screenshot of a day in Google Calendar

В настоящее время я отображения информации с компонентом ListView, но это две практические недостатки :

  1. Это далеко не ясно, когда есть разрыв
  2. Или, наоборот, когда есть перекрытие

Обе проблемы связаны с отсутствием представления длины события. Это основное, что я хотел бы исправить.

Есть ли доступный компонент, который поможет мне сделать это? Else, есть ли у кого-нибудь какие-либо предложения относительно того, как я должен делать это с нуля?

Я использую C# и winforms.

+1

Forms или WPF? :) – cwap

+0

А, Формы. Извините, отредактируйте. –

+0

Том, если вы достаточно счастливы с jquery, там отличный, который я использую в asp.net mvc. вы можете увидеть его в действии здесь: http://arshaw.com/fullcalendar/ он позволяет передавать json и/или xml из вашего db. Я смешно enogh, делая работу над этим самым сегодня! –

ответ

3

Tom, если вы готовы заплатить за коммерческий компонент планирования, вот один и аналогично есть и другие доступные на рынке.

http://www.syncfusion.com/products/user-interface-edition/windows-forms/Schedule

, но если вы намерены развивать один за себя, то, возможно, вы могли бы настроить DataGrid контроль, который по сегодняшний день надежный способ, который я мог думать. но разработка нового элемента управления окнами займет довольно много времени, и мы могли бы ожидать.

Счастливое кодирование.

+0

+1 для готового компонента, но -10 для настройки DataGrid для этой цели. Однажды я попытался, и это была поездка, которую я никогда не забуду. –

2

Мои первые мысли: A) попробуйте использовать Microsoft Charts для этого или B) Создайте настраиваемый элемент управления, который выделяет прямоугольники для каждого события, и поместите прямоугольник в соответствующий временной диапазон.

+0

Тони - я должен быть очень ленив, моя первая мысль с таким видом - посмотреть, есть ли коммерческий поддерживаемый компонент уже там - румянец !! :) –

+1

@jim, И нет ничего плохого в этом. Я просто нахожу, что обычное дело заканчивается тем, что интегрирует/реализует сторонний материал: P –

+0

Привет, Тони. Я поставил щедрость на этот вопрос. Если диаграммы - это путь вперед, не могли бы вы показать мне, как я буду продвигаться вперед? Благодарю. –

0

У меня есть код, который будет производить вывод в формате календаря дневного просмотра, как вы этого хотите. к сожалению, я не могу просто отдать это вам. но вот суть:

  1. Создание контейнера DIV, установить его на высоту вы хотите, с переливом набор для прокрутки
  2. Создать внутренний DIV, относительное позиционирование, набор высоты 50 * 24 пикселей
  3. Создайте 24 divs внутри, абсолютно расположенных, установите высоту 50 и верхнюю часть 50 * i
  4. В каждом из 24 divs создайте divs для каждой отметки tic на 25%, 50%, 75% и 100%
  5. Для того, чтобы добавить мероприятие:
    • Получить стартовый час, мин, сек и * на 50 для верхнего
    • (Получить конец час, мин, сек - запуск час, мин, сек) * 50 для высоты

Вы можете сделать все это на основе%, но я столкнулся с проблемой округления в связанных с x-браузером материалах. Что касается событий, находящихся рядом друг с другом, это был «забавный» алгоритм для выяснения.

+0

Спасибо за предложение, но я не в браузере. Мое приложение - это приложение winforms (desktop). –

+0

Извините, я пропустил это, когда впервые прочитал вопрос. Я считаю, что концепция все равно будет действительной, используя элементы управления формами, а не веб-элементы управления. – Justin808

1

Возможно, вам придется создать настраиваемый элемент управления, имеющий только функциональные возможности для изменения размера пользователя. И один менеджер макетов для обработки событий изменения размера и организации пользовательских элементов управления. Вам просто нужно убедиться, что меньший элемент управления всегда находится на вершине большего контроля, чтобы пользователь мог изменить его размер.

1

Хорошо, давайте поговорим. У меня есть несколько таких элементов управления, поэтому, возможно, я смогу помочь в решении этих проблем.

  1. определить, что является наименьшим слот, который вы хотите отобразить на экране - скажем, 15 минут
  2. разделяй области просмотра в слоты этого срока - если вам нужно отобразить 6 часов, создать список 4x6 = 24 items
  3. каждый элемент будет списком объектов расписания, найденных там
  4. итерируйте ваши объекты планирования и назначьте их списку.
  5. повторить перебор и нарисовать. у вас должно быть достаточно информации для дисплея, как показано выше.

    класс ScheduleItem { DateTime start; DateTime end; string someText; }

    класс OneSlot { список < ScheduleItem> ItemsInSlot; }

    < OneSlot> VisibleSlots;

Если вам нужна точность пикселя (вы действительно не нужен вторая точности здесь, потому что вы на экране не перемещается во время) вы делаете слот, как малым, как вы должны здесь.

8 часов 28800 секунд; если у вас установлен временной интервал 30 секунд, у вас будет 960 временных интервалов для отображения на экран.

Надеюсь, что это поможет, прокомментируйте, если вам нужно обсудить это.

+0

У меня есть трудное форматирование кода моего кода здесь ... help –

+0

Интересный вопрос о самом маленьком слоте. Вероятно, это будет 30 минут, но каждый элемент может не начинаться с 30-минутного интервала - время начала и конца должно быть точным до ближайшей секунды. (Чтобы сделать блок кода, отступ на четыре пробела или использовать обратные ссылки для коротких фрагментов.) –

+0

Я сделал отступ, но никакой помощи нет. Хорошо, вы действительно не хотите быть точным для второго ... Предположим, что у вас есть 8 часов для отображения и высота 1000 пикселей. Каждый пиксель составляет 8 * 60 * 60/1000 секунд, правильно? Таким образом, каждый пиксель составляет 28,8 секунды, делает его 30 секунд, делят 8 часов на 8 * 60 * 60/30 = 960 слотов и там вы идете. –

Смежные вопросы