Как я могу представить серию событий, таких как календарь Google? - PullRequest
4 голосов
/ 30 сентября 2010

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

Screenshot of a day in Google Calendar

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

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

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

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

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

Ответы [ 7 ]

3 голосов
/ 03 октября 2010

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

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

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

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

2 голосов
/ 06 октября 2010

Лучший из известных мне компонентов - это элемент управления планировщика devexpress:

http://www.devexpress.com/Products/NET/Controls/WinForms/Scheduler/

2 голосов
/ 30 сентября 2010

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

1 голос
/ 06 октября 2010

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

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

    class ScheduleItem {DateTime start;DateTime end;string someText;}

    class OneSlot {list ItemsInSlot;}

    list VisibleSlots;

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

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

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

1 голос
/ 05 октября 2010

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

0 голосов
/ 07 октября 2010

Другое коммерческое предложение: http://www.telerik.com/products/winforms/scheduler.aspx

0 голосов
/ 01 октября 2010

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

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

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

...