ComboBox -> Readonly



  • Hallo zusammen!

    Ich habe eine ComboBox die sich verhalten soll, als wäre sie "readonly".
    Leider gibt es bei einer ComboBox keine "readonly" Property.

    Mein Ziel: man soll während dieses Zustands nichts auswählen können, aber der Inhalt wird deutlich in "schwarz" dargestellt.

    Deswegen ist eine Lösung mit "Enabled = false" auch nicht möglich, weil dann der Inhalt nur sehr schwer zu lesen ist (Schrift ist "grau" und nicht "schwarz").

    Wäre für einen Tipp sehr dankbar!

    Evtl. habe ich auch eine Property übersehen, die sich so ähnlich wie "readonly" verhält?

    Danke und Gruß



  • So in etwa?

    public class ComboBoxEx : ComboBox
      {
        private bool mReadOnly;
        [DefaultValue( false )]
        public bool ReadOnly
        {
          get { return mReadOnly; }
          set { mReadOnly = value; }
        }
    
        protected override void OnDropDown(EventArgs e)
        {
          base.OnDropDown(e);
    
          if ( ReadOnly )
            RecreateHandle();
        }
      }
    


  • Hallo!

    Fast perfekt.

    Das Problem:
    Wenn das Feld den Focus hat kann ich durch "Pfeil hoch" und "Pfeil runter" trotzdem den Wert verändern.

    Wie kann ich das abfangen?

    Danke und Gruß



  • Evtl. noch

    protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
    
                if (mReadOnly) {
                    e.Handled = true;
                }
            }
    


  • wenn deine combobox den zustand readonly hat, merk dir den wert von SelectedIndex. Wenn dann das ereignis SelectedIndexChanged auftritt, setze den index zurück auf den "gemerkten" wert. das gleiche musst du auch für die eigenschaft Text tun, wenn die ComboBox eingabe von beliebigem text erlaubt.

    ist vielleicht nicht die eleganteste lösung, hat aber auf jeden fall den gewünschten effekt.

    oder du probierst das hier, wobei das nur ne fixe überlegung ist und möglicherweise nicht funktioniert:

    // codebeispiel modifiziert von David_pb
    public class ComboBoxEx : ComboBox
      {
        private bool mReadOnly;
        [DefaultValue( false )]
        public bool ReadOnly
        {
          get { return mReadOnly; }
          set { mReadOnly = value; }
        }
    
        protected override void OnDropDown(EventArgs e)
        {
          base.OnDropDown(e);
    
          if ( ReadOnly )
            RecreateHandle();
        }
    
        protected override void OnKeyDown(EventArgs e)
        {
          if ( ReadOnly )
            return;
    
          base.OnKeyDown(e);
        }
    
        // evtl. muss man hier auf gleiche weise noch andere key-events überschreiben
      }
    

Anmelden zum Antworten