2009-09-07 53 views
1

我具有沿着在文本值通过组合框,但它们可以具有不同的含义,例如:有没有更快的方法?

  • 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至30:30。一旦你点击事件按钮,我希望程序自动计算需要多少个插槽以及需要输入的插槽数。目前,我只能想到用大量的if语句来做这件事。

澄清:

工作需要几个小时。 1,2,3,4或5.每项工作的工作时间为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#中的子字符串?如果我可以接受一个子字符串,我可以给每个可能的开始和结束一个值,并以另一种方式做。

任何帮助将是非常有用的。

+1

请重新表述的问题。 – 2009-09-07 20:41:44

+0

所以你在你的组合框中有许多选项,就像你引用的那些。您希望用户输入一定的小时数,并且应用程序计算所需时间段的数量以填充请求的时间?那是你要的吗? – Atmocreations 2009-09-07 20:48:59

回答

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。

0

我想你可以使用位掩码。

  • 8:30 - 9:30 = 1
  • 10:30 - 11:30 = 2
  • 12:30 - 13:30 = 4
  • XXX - YYY = 8
  • etc ...

然后,你可以编码任意时间组合的单个整数。 8:30 - 11:30 = 1 + 2 = 3.10:30 - 13:30 = 2 + 4 = 6.

编辑:没关系......我不认为我理解你的问题!请澄清!

1

个人而言,我将创建一个对象,它是一个时间显示类型的对象:

class TimeDisplay 
{ 
    TimeSpan startTime; 
    TimeSpan duration; 

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

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

+0

至少你尝试过......注意,你并不总是需要的ToString(),组合框等人有一个非常强大的Format事件。 – 2009-09-07 20:56:04

+0

ToString()对于Debug.WriteLines也很有用:) – rein 2009-09-07 20:58:59

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并添加一点小复杂功能。

0

明确地使用一个小类,而不是尝试在文本框中解析直接文本。使用日期时间类型来标识开始和结束时间,将所有实例放入列表中,然后将列表绑定到组合框。

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

当从ComboBox中选定的项目,您可以访问这将是由类的类型,你所创建的ComboBox的SelectedItem属性。然后,您可以使用DateTime属性和Date数学来确定特定作业需要的小时数。

不应该有任何需要一个单一的如果,如果你使用这种方法的语句(也许除了错误处理)。一个小提示:

if (typeof(YourClass) != combo.SelectedItem.GetType()) { // error } 
相关问题