我正在寻找时间选择器的解决方案,它允许我选择以下内容:
00:30 > 01:00 > 01:30
当它到达 23:30 时,它需要绕到 0:00。
换句话说,我需要通过选择向上或向下来增加半小时的时间。我曾尝试合并一个hscroll
bar 并修改 atimepicker
但在我看来这是非常敏感和不必要的,因为我怀疑必须有一个更简单的方法?
任何建议都会很棒。
我只是对一个控件进行了分类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
}
文档:http DomainUpDown
: //msdn.microsoft.com/en-us/library/system.windows.forms.domainupdown.aspx
我过去所做的是构建一个列表(2 列)并绑定到组合框。第一列只是一个表示时间的字符串……第二列是与之对应的双精度值。然后,组合框,我将拥有基于时间表示的 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)
我能想到的一种方法是使用带有 ListBox 的用户控件,其整体高度设置为一项,并在集成列表框滚动条的顶部放置一个单独的垂直滚动条。
用可能的值填充 ListBox,例如00:00
to 23:30
。
在滚动条的 Scroll 事件中,使用 和 的比较e.OldValue
来e.NewValue
增加或减少TopIndex
ListBox 的属性,以便显示适当的项目并且它似乎正在向上或向下滚动。
然后,您可以检查是否显示了第一个或最后一个项目,但由于滚动条不会在该事件中注册滚动,您应该将一个或多个项目移动到第一个或最后一个项目之外,以便它看起来继续环绕并且scollbar 始终处于活动状态并引发其 Scroll 事件。
或者你可以做一个简单的解决方案,你有一个日期时间选择器,它只选择日期,旁边有一个 ComboBox,它的时间为 00.00、00.30 ... 23.00、23.30。我正在寻找一个解决方案,其中日期选择器将具有您正在寻找的确切功能。如果我发现更好的东西,我会编辑这篇文章。
不确定哪个版本的 .net 具有 NumericUpDown 组件,但如果你有它,你可以使用它的值更改事件。这是一些示例代码:
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;
}