Eine ComboBox, in der nach den enthaltenen Einträgen gesucht werden kann.
Es können keine neuen Einträge eingefügt werden und nur Begriffe eingegeben werden, die auch in der Liste enthalten sind.
using System;
using System.Windows.Forms;
namespace MyUserControls
{
/// <summary>
/// ComboBox, die es ermöglicht, die darin enthaltenen
/// Einträge zu suchen, jedoch keine neuen anzulegen.
/// </summary>
public class SearchableComboBox : ComboBox
{
/// <summary>
/// Initialisiert eine durchsuchbare ComboBox.
/// </summary>
public SearchableComboBox()
{
// Autovervollständigung einschalten
this.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
this.AutoCompleteSource = AutoCompleteSource.ListItems;
// Einfügen von Text mittels Kontextmenüs verhindern
this.ContextMenu = new ContextMenu();
// Einzelne Tastendrücke abfangen
this.KeyPress += new KeyPressEventHandler(SearchableComboBox_KeyPress);
}
/// <summary>
/// Wird aufgerufen, wenn eine Taste gedrückt wird.
/// Überprüft, ob es sich um eine gültige Taste handelt.
/// </summary>
private void SearchableComboBox_KeyPress(object sender, KeyPressEventArgs e)
{
// Bei der Löschtaste die Methode verlassen
if (e.KeyChar == '\b')
return;
string searchString = String.Concat(this.SelectedText != "" ? this.Text.Replace(this.SelectedText, "") : this.Text,
e.KeyChar.ToString());
bool success = false;
// Alle Einträge überprüfen, ob ein passender gefunden werden kann
foreach (object item in this.Items)
{
if (item.ToString().StartsWith(searchString))
{
success = true;
break;
}
}
// Wenn es nicht erfolgreich war, den Tastendruck verhindern
if (!success)
e.Handled = true;
}
/// <summary>
/// Verhindert das Einfügen von Text mithilfe von Strg + V.
/// </summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.V))
return true;
else
return base.ProcessCmdKey(ref msg, keyData);
}
}
}
7 Kommentare zum Snippet