寻找时间选择器控制半小时上/下

时间:2013-05-28 10:11:11

标签: c# .net winforms

我正在寻找一个时间选择器的解决方案,它允许我选择以下内容:

00:30  > 01:00  > 01:30

当它到达23:30时,它需要环绕到0:00。

换句话说,我需要通过选择向上或向下来增加半小时的时间。我尝试合并hscroll栏并修改timepicker,但在我看来这是非常敏感和不必要的,因为我怀疑必须有更简单的方法吗?

任何建议都会很棒。

4 个答案:

答案 0 :(得分:6)

我只是对一个DomainUpDown控件进行了细分,这是代码:

class TimePicker : DomainUpDown
{
    public TimePicker()
    {         
        // build the list of times, in reverse order because the up/down buttons go the other way
        for (double time = 23.5; time >= 0; time -= 0.5)
        {
            int hour = (int)time; // cast to an int, we only get the whole number which is what we want
            int minutes = (int)((time - hour) * 60); // subtract the hour from the time variable to get the remainder of the hour, then multiply by 60 as .5 * 60 = 30 and 0 * 60 = 0

            this.Items.Add(hour.ToString("00") + ":" + minutes.ToString("00")); // format the hour and minutes to always have two digits and concatenate them together with the colon between them, then add to the Items collection
        }

        this.SelectedIndex = Items.IndexOf("09:00"); // select a default time

        this.Wrap = true; // this enables the picker to go to the first or last item if it is at the end of the list (i.e. if the user gets to 23:30 it wraps back around to 00:00 and vice versa)
    }
}

将控件添加到表单中,如下所示:

TimePicker picker1;

public Form1()
{
    InitializeComponent();

    picker1 = new TimePicker();
    picker1.Name = "timePicker";
    picker1.Location = new Point(10, 10);

    Controls.Add(picker1);
}

然后当我们想要获得所选时间时(我在这里使用一个按钮),我们只使用SelectedItem属性:

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(picker1.SelectedItem.ToString()); // will show "09:00" when 09:00 is selected in the picker
}

DomainUpDown的文档:http://msdn.microsoft.com/en-us/library/system.windows.forms.domainupdown.aspx

答案 1 :(得分:1)

我过去所做的是建立了一个列表(2列)并绑定到组合框。第一列只是表示时间的字符串......第二列是与之对应的double值。那么,combboox,我将根据时间表示得到DISPLAY值,但是基于双值的ACTUAL值...

前:

Display    Actual
00:00   =  0.0
00:30   =  0.5
01:00   =  1.0
....
12:30   =  12.5
13:00   =  13.0
etc.

从那时起已经有一段时间了,但是可以通过一个简单的循环生成,增量为0.5,从0到23.50(晚上23:30)

答案 2 :(得分:1)

我能想到的一种方法是使用一个带有ListBox的用户控件,其中整数高度设置为一个项目,另一个垂直滚动条放置在集成列表框滚动条的顶部。

使用可能的值填充ListBox,例如00:0023:30

在滚动条的Scroll事件中,使用e.OldValuee.NewValue的比较来增加或减少ListBox的TopIndex属性,以便显示相应的项目并显示向上或向下滚动。

然后您可以检查是否显示了第一个或最后一个项目,但由于滚动条不会在该事件中注册滚动,您应该移动一个或多个项目超过第一个或最后一个项目,以便它看起来保持包装周围,​​scollbar始终处于活动状态并引发其Scroll事件。

答案 3 :(得分:0)

或者你可以做一个简单的解决方案,你有一个日期时间选择器,只选择日期,旁边是一个ComboBox,其时间为00.00,00.30 ... 23.00,23.30。我正在寻找一个解决方案,其中日期选择器将具有您正在寻找的确切功能。如果我找到更好的东西,我会编辑这篇文章。

编辑:

不确定具有NumericUpDown组件的.net版本,但如果您拥有它,则可以使用值更改事件。以下是一些示例代码:

    decimal previousValue = 0;
    DateTime time = new DateTime(2000, 6, 10, 0, 0, 0);
    bool justChanged = false;
    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        if (justChanged)
        {
            justChanged = !justChanged;
            return;
        }
        else
            justChanged = !justChanged;

        if (numericUpDown1.Value < previousValue)
            time = time.AddMinutes(-30);
        else
            time = time.AddMinutes(30);

        numericUpDown1.Value = decimal.Parse(time.ToString("HH,mm"));

        previousValue = numericUpDown1.Value;
    }