有更快的方法吗?

时间:2009-09-07 20:38:38

标签: c# winforms

我有一个组合框,它传递文本中的值,但它们可以有不同的含义,例如:

  • 8:30-9:30 =>插槽1
  • 10:30 - 11:30 =>插槽2
  • 12:30 - 13:30 =>插槽3

  • 8:30 - 11:30 => 1号和2号插槽。
  • 10:30 - 13:30 =>第2和第3个插槽

基本上,我想将这些值传递到数据库中。因此,如果所需的小时数为2,则该选项将自动显示8:30 - 11:30或10:30-13:30。单击事件按钮后,我希望程序自动计算需要多少个插槽,以及需要输入的插槽数。目前,我只能想到使用大量的if语句来做这件事。

澄清:

工作需要几个小时。每个工作可以工作的时间是8:30-9:30,10:30-11:30等。如果一份工作需要一个多小时,就会占用一个小时不止一个'职位空缺'。但是,我现在使用的组合框动态生成可能的小时数并将它们作为文本放入组合框中。因此,如果一个工作需要一个多小时,而不是显示8:30-9:30,10:30-11:30等,它将显示8:30-11:30,10:30-13:30等

我只是想知道(只是有个主意),你如何在C#中使用子串?如果我可以接受一个子字符串,我可以给每个可能的开始和结束一个值并以另一种方式做。

任何帮助都非常有用。

5 个答案:

答案 0 :(得分:1)

就个人而言,我会创建一个时间显示类型对象的对象:

class TimeDisplay
{
    TimeSpan startTime;
    TimeSpan duration;

    public override string ToString()
    {
        return startTime.ToString("hh:mm") + " - " + (startTime+duration).ToString("hh:mm");
    }
}

然后,我会用这些对象的列表填充组合框。 这与我从你的问题中收集到的差不多。

答案 1 :(得分:1)

我遗漏了常规/明显的位

class JobSlot
{
    public JobSlot (DateTime start, int hours) { ... }
    // ...
    public DateTime End { get { return Start + Hours; } } // not the correct way to add a time, but you get the picture
    public string SlotName { get { return Start.ToString () + "-" + End.ToString  (); } }
    public string ToString () { return SlotName (); }
}

LoadComboBoxWithSlots (int hours)
{
    List < JobSlot > slots;
    for ( DateTime start = FirstStartTime; start <= LastEndTime - hours; start += SlotStartTimeOffset )
        slots.Add (new JobSlot (start, hours));

    selectSlotComboBox.DataSource = slots;
    selectSlotComboBox.DisplayMember = "SlotName";
    selectSlotComboBox.Bindings.Add ("SelectedItem", bindingSource, "Slot")
}

这应该让你开始。您可以对JobSlot绑定执行其他处理以提取插槽的数量,这应该是slot.Hours / SlotStartTimeOffset。

答案 2 :(得分:0)

我猜你可以使用位掩码。

  • 8:30 - 9:30 = 1
  • 10:30 - 11:30 = 2
  • 12:30 - 13:30 = 4
  • xxx - yyy = 8
  • 等...

然后,您可以使用单个整数对任意时隙组合进行编码。 8:30 - 11:30 = 1 + 2 = 3. 10:30 - 13:30 = 2 + 4 = 6。

编辑:没关系......毕竟我认为我不明白你的问题!请澄清!

答案 3 :(得分:0)

我不确定我完全理解,但我会给它一个刺。

以下函数接受一个整数duration,指定所需的插槽数,并输出时间字符串列表。如果您愿意,可以直接添加到组合框中。

List<string> GetSlots(int duration)
{
    var slots = new List<string>();
    int[] startTimes = new int[] { 8, 10, 12 }; // etc.

    foreach(int h in startTimes)
    {
        // assuming all start times are on the h:30 
        slots.Add(h + ":30 - " + (h + duration) + ":30"); 
    }

    return slots;
}

我使用int来简化,但你可以使用TimeSpan或DateTime并添加一点复杂功能。

答案 4 :(得分:0)

绝对使用小类而不是尝试解析文本框中的直接文本。使用datetime类型来标识开始和结束时间,将所有实例抛出到列表中,并将列表绑定到组合框。

您可以覆盖类的tostring方法以打印开始/结束时间,或者您可以在类上拥有公共属性,并使用ComboBox的DisplayMember和ValueMember属性。

当从ComboBox中选择一个项目时,您可以访问ComboBox的SelectedItem属性,该属性将通过您创建的类的类型来访问。然后,您可以使用DateTime属性和日期数学来确定特定作业将采用的小时数。

不需要单个If语句(可能是错误处理除外)。如果您使用此方法,请提供快速提示:

 if (typeof(YourClass) != combo.SelectedItem.GetType()) { // error }