繁体   English   中英

时间跟踪栏或使用跟踪栏的超大值

[英]Time Trackbar or Very Large Values using Trackbar

我正在使用GMAP.NET编写车辆跟踪应用程序

我想根据日期/时间显示多个车辆标记的同时移动。

为此,我想使用跟踪栏,以便当用户滑动跟踪栏时,显示多个标记的相应移动。

我在浏览器上做了同样的应用程序,并且效果很好。 我将标记标记的datetime属性转换为UNIX时间戳,然后将跟踪栏(NOUI滑块)的值设置为UNIX时间戳范围。

但是,现在我发现我无法使用Windows桌面C#跟踪栏完全做到这一点。

问题是:

  1. 跟踪栏无法采用非常大的时间戳记值。 例如。 5年数据。

  2. 即使减少了非常大的数字,轨迹栏仍然无法采用如此高的值,并且会一直滞后或崩溃。

例如。 我需要显示5年的数据。 在这种情况下,我的轨迹栏将具有最小值-1262304000(即2010年1月1日)到1425203100(即2015年3月1日| 09:45)。

但是,这么大的值对我的跟踪栏不起作用。

我什至减少了例如。 将1262304000设置为1,然后162899100(即1425203100-1262304000)成为我的最大值。

但这甚至是非常密集的,并且轨迹栏不起作用。

请建议是否有一个时间跟踪栏,它可以显示很大的日期时间范围,或者我该如何使用具有很大值的常规跟踪栏。

代码如下-

A.将日期时间转换为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列的Unix TimeStamp,从数据表中获取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();

C.通过从数据表中的datetime列获取最小值和最大值,然后将范围作为最小值和最大值之间的差,来初始化跟踪栏。 因此,轨迹栏范围= 1至(最大-最小)

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;

在这种规模下使用TrackBar存在两个问题。

首先,您需要能够左右移动轨迹栏,但是如果SmallChangeLargeChange属性太小,则可能会取得很大的进步,但是它根本不会显示在轨迹栏上。 试试这个开始:

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

另一个问题是TrackBar控件尝试沿其长度呈现有用的小刻度线。 默认情况下, TickFrequency1Maximum10 当您设置Maximum162899100 ,而不改变TickFrequency那么可怜TrackBar控制有尝试和渲染162899100刻度线,并且需要很长的时间。 尝试这个:

trackBarMoveTarget.TickFrequency = rangeint / 100;

现实一点-轨迹栏的分辨率只有1像素-大多数显示器的宽度最大为1920像素。 因此,分辨率只需为1920-我们将其舍入为2000。

现在您有一个5年期限= 5 * 365 + 1(对于奇leap年)=1826。这几乎等于我们原来的2000奇数。 因此,让它达到1826。

因此,将“最小值”设置为0,将“最大值”设置为1826。

当您获得跟踪事件时,您会选择第一个日期01-01-2010并将跟踪栏的值添加到其中:

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

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

简单快捷。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM