C# 时间轨迹栏或使用轨迹栏的非常大的值

C# 时间轨迹栏或使用轨迹栏的非常大的值,c#,winforms,datetime,trackbar,gmap.net,C#,Winforms,Datetime,Trackbar,Gmap.net,我正在使用GMAP.NET编写一个车辆跟踪应用程序 我想根据日期/时间显示多个车辆标记的同时移动 为此,我想使用一个轨迹栏,这样当用户滑动轨迹栏时,就会显示多个标记的相应移动 我在浏览器上做了同样的应用程序,效果非常好。我将marker标记的datetime属性转换为UNIX时间戳,然后将trackbar NOUI滑块值设置为UNIX时间戳范围 但是,现在我发现用Windows桌面C轨迹栏根本做不到这一点 问题是: 轨迹栏无法获取非常大的时间戳值。5年的数据 即使在减少了非常大的数字后,轨迹栏仍

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

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

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

我在浏览器上做了同样的应用程序,效果非常好。我将marker标记的datetime属性转换为UNIX时间戳,然后将trackbar NOUI滑块值设置为UNIX时间戳范围

但是,现在我发现用Windows桌面C轨迹栏根本做不到这一点

问题是:

轨迹栏无法获取非常大的时间戳值。5年的数据

即使在减少了非常大的数字后,轨迹栏仍然不能接受如此高的值,并且保持滞后或崩溃

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

但是这么大的值对我的轨迹栏不起作用

我甚至将1262304000设置为1,然后162899100即1425203100-1262304000成为我的最大值

但即使这样也非常密集,轨迹栏也不起作用

请建议是否有一个可以显示非常大的datetimerange的时间跟踪栏,或者我如何使用具有非常大值的常规跟踪栏

守则内容如下—

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

现实点-轨迹栏的分辨率只有1像素-大多数显示器的宽度最多为1920像素。因此,决议只需要1920年——让我们把它四舍五入到2000年

现在你有一个5年的周期=5*365+1作为奇数闰年=1826。这几乎等于我们原来的2000多个。那么让我们定在1826年吧

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

当您获得径赛项目时,您将选择2010年1月1日的第一个日期,并将轨迹栏的值添加到该日期:

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

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

简单快速。

在这种比例下使用轨迹栏有两个问题

首先,您需要能够左右移动轨迹栏,但是如果SmallChange和LargeChange属性太小,那么您可能会取得很大的进步,但它不会显示在轨迹栏上。首先尝试以下方法:

trackBarMoveTarget.Maximum = rangeint;
trackBarMoveTarget.Minimum = 1;
trackBarMoveTarget.LargeChange = rangeint / 50;
trackBarMoveTarget.SmallChange = rangeint / 200;
另一个问题是轨迹栏控件试图沿其长度呈现有用的小记号。默认情况下,频率为1,最大值为10。如果在不更改TickFrequency的情况下将“最大值”设置为162899100,则较差的轨迹栏控件必须尝试渲染162899100记号,这需要很长时间。试试这个:

trackBarMoveTarget.TickFrequency = rangeint / 100;

请出示您的密码!你应该阅读和阅读。谢谢你的评论。但我认为代码在这里不会有任何区别。我的代码做什么?1.将datetime转换为Unix时间戳公用函数我从网络上取下2。设置轨迹栏的范围->我的基本问题是轨迹栏如何处理非常大的值?或者有其他方法吗?你应该经常发布你的代码。这是这里的正确礼仪。尽管如此,我还是会给你一个提示——大的改变,小的改变,滴答的频率。而且,既然你不知道如何解决这个问题,你就不应该得出代码没有帮助的结论。事实上,当我们回答问题时,我们喜欢有一个对话,这样我们就可以看到你的问题在起作用,然后我们可以在发布之前验证我们的答案是否正确。谢谢你的评论。积极性:请参考下面Ubercoder的评论,如果您能以这种方式提供帮助,请务必告诉我:真的困在这里了!谢谢你的解决方案。如果值仅为天,则此操作将非常有效。但就我而言,这是最重要的。典型值为01-01-2013 09:35。请提供建议。正如我从一开始所说,轨迹栏在5年内不可能有分钟甚至小时的分辨率。它受到具有屏幕分辨率限制的UI的限制。它有有限数量的位置,您可以将轨迹栏滑动到这些位置。这个数字大约是1900。所以你只能把你五年的时间分为一天多的几部分。谢谢你的澄清,我真的很感谢你抽出时间来帮助我。但是JQuery滑块是如何工作的呢?我用的是NoUISlider,当应用程序是基于浏览器的,并且具有相同的5年datetime范围时,它工作得非常好!对不起,我无法为你的答案打分,因为我没有声誉。我不知道它是怎么说的-谢谢。我意识到轨迹栏有一个限制,必须使用你的和@En来解决它
igmativity的解决方案。嗨!谢谢你的提示。我正在用你的两个答案做一个练习因为trackbar有一些限制,我现在明白了。在我的应用程序中有很多繁重的UI工作,因为根据轨迹栏的移动沿地图重新绘制多个标记。我将努力减少这种情况。另外,由于我没有足够的声誉,无法获得答案。
trackBarMoveTarget.TickFrequency = rangeint / 100;