2016-01-27 3 views
0

Я пишу приложение для отслеживания транспортных средств с использованием GMAP.NETВремя TrackBar или очень большие значения с помощью TrackBar

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

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

Я сделал то же самое приложение в браузере, и он работал очень хорошо. Я преобразовал атрибут datetime метки метки в временную метку UNIX, а затем установил значения трекбара (NOUI Slider) в диапазон временных интервалов UNIX.

Но теперь я обнаружил, что не могу вообще этого сделать с помощью Windows Desktop C# Trackbar.

Проблемы:

  1. TrackBar не может принимать очень большие значения временных меток. Например. 5 лет.

  2. Даже после уменьшения очень больших номеров трек-брус по-прежнему не может принимать такие высокие значения и сохраняет отставание или сбой.

Например. Мне нужно показать данные в течение 5 лет. В этом случае мой трекбар будет иметь минимальное значение - 1262304000 (то есть 01-01-2010) до 1425203100 (т. Е. 01-03-2015 | 09:45).

Но такие большие значения просто не работают с моим трекболом.

Я даже принял сокращение, например. значение 1262304000 как 1, а затем 162899100 (т. е. 1425203100 - 1262304000) становится моим максимальным значением.

Но даже это очень интенсивно, а трек-бар не работает.

Просьба предложить, если есть время-TrackBar, который может показать очень большой datetimerange или как я могу использовать регулярные TrackBar с очень большими значениями.

код следующим образом -

A. Функция для преобразования DateTime к UNIX Отметка

public Int32 UnixTimeStampUTC(DateTime datetime) 
    { 
     Int32 unixTimeStamp; 

     DateTime zuluTime = datetime.ToUniversalTime(); 
     DateTime unixEpoch = new DateTime(1970, 1, 1).ToUniversalTime(); 
     unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; 
     return unixTimeStamp; 
    } 

B. Принимая DateTime из DataTable конкатенацией Дата & Время Столбцы и добавление третьего Колонка для хранения Отметка времени Unix из DateTime Колонка

  for (int z = 0; z < dt.Rows.Count; z++) 
      { 

       if (reviseddt.Rows[z]["date"].ToString() != "") 
       { 
        dte = DateTime.Parse(reviseddt.Rows[z]["date"].ToString()); 

        dteticks = UnixTimeStampUTC(dte); 

       } 
       else 
       { 
        dteticks = 0; 
       } 

       if (reviseddt.Rows[z]["time"].ToString() != "") 
       { 
        tm = DateTime.Parse(reviseddt.Rows[z]["time"].ToString()); 

        tmticks = UnixTimeStampUTC(tm); 
       } 
       else 
       { 
        tmticks = 0; 
       } 


       Int32 fullDt = dteticks + tmticks; 

       reviseddt.Rows[z]["datetime"] = fullDt.ToString(); 
       reviseddt.Rows[z]["datetimestring"] = reviseddt.Rows[z]["date"].ToString() + reviseddt.Rows[z]["time"].ToString(); 

С. Initalising TrackBar от Getti ng минимальное и максимальное значения из столбца datetime в datatable, а затем взятие диапазона в качестве разницы между значениями min и max. Следовательно, TrackBar диапазон = 1 в (Max-Min)

string strminlevel = toplotDataTable.Compute("min(datetime)", String.Empty).ToString(); 
string strmaxLevel = toplotDataTable.Compute("max(datetime)", String.Empty).ToString(); 

Int32 minLevel = Convert.ToInt32(strminlevel); 
Int32 maxLevel = Convert.ToInt32(strmaxLevel); 

Int32 rangeint = maxLevel - minLevel; 

trackBarMoveTarget.Maximum = rangeint; 
trackBarMoveTarget.Minimum = 1; 
trackBarMoveTarget.LargeChange = 100; 
trackBarMoveTarget.SmallChange = 1; 
+1

Пожалуйста, покажите нам свой код! Вы должны прочитать [ask] и [mcve]. – Enigmativity

+0

Благодарим вас за комментарий. Но я не думаю, что код здесь будет иметь значение. Что делает мой код? 1. Преобразует дату и время в временную метку Unix (общая функция, которую я снял с сети) 2. Устанавливает диапазон для трекбара -> Мой основной вопрос: как работает трекер с очень большими значениями? Или есть другой метод? – itzprobablyme

+0

Вы всегда должны размещать свой код. Это правильный этикет. Тем не менее, я дам вам подсказку: 'LargeChange',' SmallChange', 'TickFrequency'. – Enigmativity

ответ

-1

Будьте реалистами - TrackBar только имеет разрешение до 1 пиксель - большинство дисплеев, в большинстве 1920 пикселей в ширину. Поэтому разрешение должно быть только в 1920 году - давайте рассмотрим его до 2000 года.

Теперь у вас есть 5-летний период = 5 * 365 + 1 (для нечетного високосного года) = 1826. Это почти равно нашему оригинальному 2000 нечетному. Так давайте сделаем это 1826

Так установите минимальное значение 0 и максимальное значение в 1826

Когда вы получаете событие трека вы берете первую дату 01.01.2010 и добавить значение TrackBar к нему:

var firstDate = new DateTime(2010, 1, 1).Date; 

var trackDate = firstDate + TimeSpan.FromDays(trackBar.Value); 

легко и быстро.

+0

Спасибо за ваше решение. Это будет отлично работать, если значение составляет только дни. Но, в моем случае, дело доходит до минуты. Типичным значением является «01-01-2013 09:35». Пожалуйста, порекомендуйте. – itzprobablyme

+0

Как я начал с самого начала, в трек-баре не может быть разрешения минут или даже часов в течение 5 лет. Он ограничен пользовательским интерфейсом, который имеет ограничения разрешения экрана. Он имеет конечное количество позиций, в которые вы можете перемещать дорожку. Это число составляет порядка 1900 года. Таким образом, вы можете разделить свой пятилетний период на столько ломтиков, что чуть больше одного дня. –

+0

Благодарим вас за разъяснения, и я очень благодарен вам за то, что вы нашли время, чтобы помочь. Но как работают слайдеры JQuery? Я использовал NoUISlider (http://refreshless.com/nouislider/), и он отлично работал, когда приложение было основано на браузере с тем же пятилетним диапазоном дат. – itzprobablyme

0

Есть две проблемы с использованием TrackBar в этом виде шкалы.

Сначала вы должны иметь возможность перемещать полосу дорожки влево и вправо, но если свойства SmallChange и LargeChange слишком малы, то вы можете добиться больших успехов, но это просто не отображается на панели дорожек , Попробуйте для начала:

trackBarMoveTarget.Maximum = rangeint; 
trackBarMoveTarget.Minimum = 1; 
trackBarMoveTarget.LargeChange = rangeint/50; 
trackBarMoveTarget.SmallChange = rangeint/200; 

Другая проблема заключается в том, что управление TrackBar пытается оказывать полезные маленькие засечек по всей длине. По умолчанию TickFrequency - 1, а значение Maximum - 10. Когда вы устанавливаете Maximum на номер 162899100 без изменения TickFrequency, тогда бедный TrackBar должен попытаться обработать 162899100 отметки об отметках, и это занимает много времени. Попробуйте следующее:

trackBarMoveTarget.TickFrequency = rangeint/100; 
+0

HI! Спасибо за подсказку. Я использую ваши ответы. :) Как есть ограничения с трекбаром, и теперь я понимаю. В моем приложении много тяжелых пользовательских интерфейсов, поскольку несколько маркеров перерисовываются вдоль карты на основе движения трекбара. Я буду работать, чтобы уменьшить это. Кроме того, не удалось забить ответ, поскольку у меня недостаточно репутации. – itzprobablyme