使用轨迹栏的时间跟踪栏或非常大的值

时间:2016-01-27 04:27:08

标签: c# winforms datetime trackbar gmap.net

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

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

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

我在浏览器上执行了相同的应用程序,但效果非常好。我将marker标记的datetime属性转换为UNIX时间戳,然后将轨迹栏(NOUI Slider)值设置为UNIX时间戳范围。

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

问题是:

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

  2. 即使减少了非常大的数字,轨道栏仍然无法获得如此高的值并且保持滞后或崩溃。

  3.   

    EG。我需要显示5年的数据。在这种情况下,我的轨迹栏将具有最小值 - 1262304000(即01-01-2010)至1425203100(即01-03-2015 | 09:45)。

         

    但是这样的大值不适用于我的轨迹栏。

         

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

         

    但即使这是非常密集的,跟踪栏也不起作用。

    请建议是否有时间轨道栏可以显示非常大的日期时间范围,或者我如何使用具有非常大值的常规轨道栏。

    代码如下 -

    一个。将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中。通过连接日期和数据从DataTable获取DateTime时间列和添加第三列以保存DateTime列的Unix TimeStamp

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

    ℃。通过获取数据表中datetime列的最小值和最大值,然后将范围作为最小值和最大值之间的差值来使轨迹栏初始化。因此,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;
    

2 个答案:

答案 0 :(得分:0)

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

首先,你需要能够左右移动轨迹栏,但如果SmallChangeLargeChange属性太小,那么你可能会取得很大进展,但它根本就没有在赛道栏上显示。试试这个:

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

另一个问题是TrackBar控件试图沿其长度呈现有用的小刻度线。默认情况下,TickFrequency1Maximum值为10。当您将Maximum设置为162899100而不更改TickFrequency时,不良TrackBar控件必须尝试渲染162899100刻度标记,这需要很长时间。试试这个:

trackBarMoveTarget.TickFrequency = rangeint / 100;

答案 1 :(得分:-1)

逼真 - 轨迹栏的分辨率只有1像素 - 大多数显示器的宽度最多为1920像素。因此,分辨率必须是1920年 - 让它一直到2000年。

现在你有一个5年的时间= 5 * 365 + 1(对于奇数闰年)= 1826.这几乎等于我们原来的2000多数。所以,让它成为1826年。

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

当您收到赛道事件时,您将获取第一个日期01-01-2010并将轨道栏的值添加到其中:

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

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

简单快捷。