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

本文关键字:跟踪 非常 时间 | 更新日期: 2023-09-27 18:31:58

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

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

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

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

但是,现在我发现我根本无法使用Windows Desktop C#跟踪栏执行此操作。

问题是:

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

  2. 即使减少了非常大的数字,跟踪栏仍然无法接受如此高的值,并且一直滞后或崩溃。

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

但是这么大的值不适用于我的跟踪栏。

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

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

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

代码如下 -

一个。将日期时间转换为 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 时间戳,从 DataTable 获取 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. 通过从数据表中的日期时间列中获取最小值和最大值,然后将范围作为最小值和最大值之间的差值来启动跟踪栏。因此,跟踪栏范围 = 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控件尝试沿其长度呈现有用的小刻度线。默认情况下,TickFrequency 1Maximum值为 10 。当您在不更改TickFrequency的情况下将Maximum设置为 162899100 时,较差的TrackBar控件必须尝试呈现162899100刻度线,这需要很长时间。试试这个:

trackBarMoveTarget.TickFrequency = rangeint / 100;

现实一点 - 跟踪栏的分辨率只有 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);

简单快捷。