2009-09-07 9 views
1

j'ai un combobox qui passe le long des valeurs dans le texte, mais ils peuvent avoir des significations différentes, par exemple:Y a-t-il un moyen plus rapide?

  • 8:30 - 9h30 => fente 1
  • 10:30-11:30 = > fente 2
  • 12:30 - 13:30 => fente 3

ou

  • 8:30 - 11:30 => emplacements 1 et 2.
  • 10 heures 30-13h30 => fentes 2 et 3

Fondamentalement, je veux transmettre ces valeurs dans une base de données. Donc, si le nombre d'heures requis est de deux, alors l'option affichera automatiquement 8:30 - 11:30 ou 10: 30-13: 30 déjà. Une fois que vous avez cliqué sur le bouton d'événement, je veux que le programme calcule automatiquement le nombre d'emplacements requis et le nombre d'emplacements à entrer. Pour l'instant, je ne peux penser à le faire en utilisant une quantité gargantuesque de déclarations if.

Précision:

Un travail va prendre un certain nombre d'heures. 1, 2, 3, 4 ou 5. Les heures d'emploi de chaque emploi sont de 8h30 à 9h30, de 10h30 à 11h30, etc. Si un travail prend plus d'une heure, il prendra en charge plus d'un «créneau d'emploi». Toutefois, la zone de liste déroulante que j'utilise en ce moment génère dynamiquement les heures possibles et les place en tant que texte dans une zone de liste déroulante. Par conséquent, si un travail prend plus d'une heure, au lieu d'afficher 8: 30-9: 30, 10: 30-11: 30 etc. il affichera 8: 30-11: 30, 10: 30-13: 30 etc. Je me demandais juste (juste eu une idée), comment prenez-vous une sous-chaîne en C#? Si je pouvais prendre une sous-chaîne, je pourrais donner à chaque début possible et finir une valeur et le faire d'une autre manière.

Toute aide serait vraiment utile.

+1

S'il vous plaît reformuler les questions. –

+0

de sorte que vous avez un certain nombre d'options dans votre combo-box comme ceux que vous avez cités. vous voulez que l'utilisateur entre une certaine quantité d'heures et l'application calcule le nombre d'emplacements requis pour remplir l'heure demandée? Est-ce que c'est ce que tu veux? – Atmocreations

Répondre

1

Je l'ai laissé de côté les bits de routine/évidents

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") 
} 

Cela devrait vous aider à démarrer. Vous pouvez effectuer un traitement supplémentaire sur la liaison JobSlot pour extraire le nombre d'emplacements, qui doit être slot.Hours/SlotStartTimeOffset.

0

Vous pouvez utiliser un masque de bits, je suppose.

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

Ensuite, vous pouvez encoder des combinaisons arbitraires d'intervalles de temps avec un seul entier. 8:30 - 11:30 = 1 + 2 = 3. 10:30 - 13:30 = 2 + 4 = 6.

EDIT: peu importe ... je ne pense pas avoir compris votre question après tout ! Précisez s'il vous plaît!

1

Personnellement, je voudrais créer un objet qui est un objet de type d'affichage du temps:

class TimeDisplay 
{ 
    TimeSpan startTime; 
    TimeSpan duration; 

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

Ensuite, je remplir la zone de liste déroulante avec une liste de ces objets. C'est à peu près tout ce que j'ai pu comprendre de votre question.

+0

Au moins vous avez essayé ... Notez que vous n'avez pas toujours besoin de ToString(), ComboBox et al ont un événement Format très puissant. –

+0

ToString() est aussi utile pour Debug.WriteLines :) – rein

0

Je ne suis pas sûr de comprendre totalement, mais je vais essayer.

La fonction suivante accepte un nombre entier duration spécifiant le nombre d'emplacements requis et génère une liste des chaînes de temps. Vous pouvez ajouter directement à votre liste déroulante si vous le souhaitez.

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; 
} 

I utilisé int pour simplifier, mais vous pouvez utiliser TimeSpan ou DateTime et ajouter juste une petite complication.

0

Utilisez une petite classe au lieu d'essayer d'analyser du texte directement dans une zone de texte. Utilisez les types datetime pour identifier les heures de début et de fin, lancer toutes les instances dans une liste et lier la liste à la zone de liste déroulante.

Vous pouvez remplacer la méthode tostring de la classe pour imprimer les heures de début/fin, ou vous pouvez avoir des propriétés publiques sur la classe et utiliser les propriétés DisplayMember et ValueMember de la zone de liste déroulante.

Lorsqu'un élément est sélectionné dans la zone de liste déroulante, vous avez accès à la propriété SelectedItem de la zone de liste déroulante qui sera définie par le type de la classe que vous avez créée. Ensuite, vous pouvez utiliser les propriétés DateTime et Date mathématique pour déterminer le nombre d'heures que le travail particulier prendra.

Il devrait y avoir pas besoin d'une seule instruction If (sauf peut-être la gestion des erreurs) .Une astuce rapide si vous utilisez cette méthode:

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