Einfacher ComboBox-Separator

    • Allgemein

      Einfacher ComboBox-Separator

      Moin Leute,
      in einer ComboBox sind mehrere Sorten von Items, zwischen beiden sollte im aufgeklappten Zustand ein Separator sichtbar sein, der aber im SelectedIndexChanged-Event nichts anstellt.
      Ownerdrawing wollte ich nicht, weil da die Property .DropDownStyle = ComboBoxStyle.DropDownList schlecht darzustellen ist.
      Dass Enums verwendet werden, ist nicht von Belang, hier dient es der Bequemlichkeit.
      Im SelectedIndexChanged-Event werden die Separatoren abgefragt und, je nach dem, wo die letzte Selektion lag, das wird in der Variable LastItem gespeichert, wird das Item davor oder danach ausgewählt.
      So ist gesichert, dass die Separatoren nicht selektiert werden können.
      Der
      String, der bei den Separatoren steht, ist hier als Überschrift
      gedacht, Ihr könnt da natürlich reinschreiben was Ihr wollt oder die
      Items einfach leer lassen.OK, hier der Code, Form mit ComboBox und Label:
      C#

      C#-Quellcode

      1. using System;
      2. using System.Windows.Forms;
      3. namespace ComboBoxSeparator
      4. {
      5. public partial class Form1 : Form
      6. {
      7. private enum ComboItems
      8. {
      9. Item1,
      10. Item2,
      11. Item3,
      12. Separator1,
      13. Item4,
      14. Item5,
      15. Item6,
      16. Separator2,
      17. Item7,
      18. Item8,
      19. Item9,
      20. Last,
      21. }
      22. /// <summary>
      23. /// letzter selektierter Index für das ComboBox-Separator-Handling
      24. /// </summary>
      25. private int LastItem = -1;
      26. public Form1()
      27. {
      28. this.InitializeComponent();
      29. // für jedes Item eine Zeile, Separatoren bekommen eine andere Zeile
      30. for (ComboItems item = ComboItems.Item1; item < ComboItems.Last; item++)
      31. {
      32. if (item == ComboItems.Separator1)
      33. {
      34. this.comboBox1.Items.Add("- Separator 1");
      35. }
      36. else if (item == ComboItems.Separator2)
      37. {
      38. this.comboBox1.Items.Add("- Separator 2");
      39. }
      40. else
      41. {
      42. this.comboBox1.Items.Add(item.ToString());
      43. }
      44. }
      45. }
      46. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
      47. {
      48. int index = this.comboBox1.SelectedIndex;
      49. ComboItems item = (ComboItems)index;
      50. if (item == ComboItems.Separator1 ||
      51. item == ComboItems.Separator2)
      52. {
      53. if (this.LastItem < index)
      54. {
      55. // das nächste Item selektieren
      56. this.comboBox1.SelectedIndex++;
      57. }
      58. else
      59. {
      60. // das letzte Item selektieren
      61. this.comboBox1.SelectedIndex--;
      62. }
      63. return;
      64. }
      65. this.LastItem = index;
      66. this.label1.Text = item.ToString();
      67. }
      68. }
      69. }
      VB.NET

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Enum ComboItems
      3. Item1
      4. Item2
      5. Item3
      6. Separator1
      7. Item4
      8. Item5
      9. Item6
      10. Separator2
      11. Item7
      12. Item8
      13. Item9
      14. Last
      15. End Enum
      16. ''' <summary>
      17. ''' letzter selektierter Index für das ComboBox-Separator-Handling
      18. ''' </summary>
      19. Private LastItem As Integer = -1
      20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      21. ' für jedes Item eine Zeile, Separatoren bekommen eine andere Zeile
      22. For i = CInt(ComboItems.Item1) To CInt(ComboItems.Last) - 1
      23. Dim item As ComboItems = CType(i, ComboItems)
      24. If item = ComboItems.Separator1 Then
      25. Me.ComboBox1.Items.Add("- Separator 1")
      26. ElseIf item = ComboItems.Separator2 Then
      27. Me.ComboBox1.Items.Add("- Separator 2")
      28. Else
      29. Me.ComboBox1.Items.Add(item.ToString())
      30. End If
      31. Next
      32. End Sub
      33. Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged
      34. Dim index As Integer = Me.ComboBox1.SelectedIndex
      35. Dim item As ComboItems = CType(index, ComboItems)
      36. If item = ComboItems.Separator1 OrElse item = ComboItems.Separator2 Then
      37. If LastItem < index Then
      38. ' das nächste Item selektieren
      39. Me.ComboBox1.SelectedIndex += 1
      40. Else
      41. ' das letzte Item selektieren
      42. Me.ComboBox1.SelectedIndex -= 1
      43. End If
      44. Return
      45. End If
      46. LastItem = index
      47. Me.Label1.Text = item.ToString()
      48. End Sub
      49. End Class


      Also dann: Gute Separierung.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!