2009-09-07 83 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 } 
相關問題