2017-01-16 1 views
0

Ich entwickle Win Form Application In meiner UI muss ich ComboBox machen, die DropDown nur zuerst sein sollte, aber nach der Auswahl eines Artikels, sollte es teilweise bearbeitbar sein.Custom Control - Wie zeichne Textbox auf Combobox

E.G. Optionen sind wie,

Element Wert - 10

Element Wert - 20

Element Wert - 30 usw.

Wenn nun Item Value - 20 ausgewählt, Nummer 20 soll bearbeitet werden (20- 29 natürlich)

Aber hier Bearbeitung sollte erlaubt sein, nur numerische Wert, nicht Text Teil zu ändern. und nur der numerische Teil sollte ausgewählt werden, um ihn benutzerfreundlicher zu machen.

Wenn es einige interne Eigenschaften in ComboBox zu tun gibt (was ich denke, wird nicht der Fall sein), wird es geradlinig Weg sein.

Sonst habe ich gedacht, eine TextBox genau auf ComboCox gezeichnet/platziert zu haben.

In diesem Ansatz bin ich nicht klar, wie TextBox setzt so genau, dass meine benutzerdefinierte Steuerung wie einzelne Einheit sieht und es nicht überlappen „text“ Teil Combobox?

+0

Bearbeiten Sie Ihre Frage, um anzugeben, ob Sie WinForms, WPF oder eine andere Benutzerschnittstellen-API verwenden. – RogerN

+0

Ich würde lieber für eine regulat Combobox gehen und versuchen, die Eingabe im Tastendruck-Ereignis zu steuern. Oder verwenden Sie [vaöidation] (https://www.google.com/search?q=c%23+validate+combobox&ie=utf-8&oe=utf-8). – TaW

+0

@RogerN Ich habe meine Frage bearbeitet. Ich benutze WinForm. – Amit

Antwort

0

Ich glaube nicht, dass das Kombinationsfeld-Steuerelement auf diese Weise verwendet werden sollte, da ein einfaches validiertes Textfeld eine bessere Kontrolle für Sie und den Benutzer zu sein scheint, wenn sie Daten eingeben müssen. Zugegeben, Sie könnten einfach alle benötigten Zahlen in das Kombinationsfeld einfügen, aber der Benutzer müsste zu der gewünschten Nummer blättern. Wenn diese Liste groß ist, wird sie nicht sehr benutzerfreundlich sein. Das Problem mit dem Benutzer, der etwas in das Kombinationsfeld eingibt, hängt davon ab, was zu tun ist, wenn der Benutzer mit der Eingabe fertig ist. Wenn der Benutzer mit der Eingabe von etwas in das Kombinationsfeld fertig ist, passiert nichts, bis der Benutzer den Schlüssel Enter drückt.

Wenn der Benutzer etwas eintippt, das mit einem der Elemente in der Liste übereinstimmt, und dann den Schlüssel Enter drückt, werden die Kombinationsfelder SelectedIndexChanged Ereignis ausgelöst. Wenn der Benutzer jedoch etwas eingibt, das sich NICHT in der Elementliste befindet und den Schlüssel Enter drückt, wird das Ereignis SelectedIndexChanged NICHT ausgelöst.

Mit dem Kombinationsfeld KeyDown Ereignis können Sie den "EnterKey" erfassen, wenn der Benutzer die Eingabetaste im Kombinationsfeld drückt, da der Benutzer ohnehin einen vorhandenen Eintrag auswählen würde. Wenn also der Benutzer etwas eingibt, das bereits in der Liste vorhanden ist, und die Taste Enter gedrückt wird, werden die BEIDE SelectedIndexChanged UND KeyDown Ereignisse in dieser Reihenfolge ausgelöst. Wenn der Benutzer etwas eingibt, das NICHT in der Elementliste enthalten ist, wird nur das Ereignis KeyDown ausgelöst.

Mit dem Ereignis KeyDown wird überprüft, was der ausgewählte Wert ist. Wenn das vom Benutzer eingegebene Element in der Elementliste enthalten ist, können wir diese ignorieren, so wie sie im vorherigen Aufruf an SelectedIndexChanged behandelt wurden. Wenn der Benutzer etwas Neues eingegeben hat, müssen Sie möglicherweise den Bereich der Werte überprüfen, dann rufen Sie einfach Ihre Methode mit den Benutzereingaben auf.

Wieder scheint dies Hacky und IMHO, eine validierte Textfeld wäre einfacher für Sie und einfach für den Benutzer vor allem, wenn sie es trotzdem eingeben müssen.

List<string> comboData; 
public Form1() { 
    InitializeComponent(); 
    comboData = new List<string>(); 
    for (int i = 1; i < 100; i++) { 
    comboData.Add(i.ToString()); 
    } 
    comboBox1.DataSource = comboData; 
} 
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { 
    MessageBox.Show("selection changed " + comboBox1.Text); 
} 
private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
    if (e.KeyCode == Keys.Enter) { 
    if (comboData.Contains(comboBox1.Text.ToString())) { 
     MessageBox.Show("User entered existing data: " + comboBox1.Text); 
     // selection changed event has already handled this, however 
     // if the user just pressed "enter" previously 
     // then selection changed event wont get fired because the selection did not change 
    } 
    else { 
     MessageBox.Show("User entered NEW data: " + comboBox1.Text); 
     // we have data that is NOT currently in the list 
     // so selection changed WONT get fired 
     // need to call your method with user typed value 
    } 
    } 
} 
// make user user only enters numbers 
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e) { 
    if (!Char.IsNumber(e.KeyChar)) { 
    e.Handled = true; 
    } 
} 

Hinweis: Ich kann nicht genau sagen, was genau Ihre Combo-Artikel-Liste enthält. Wenn in den Elementen wie "Objektwert -" Text enthalten ist, scheint dies unnötig zu sein. Im obigen Code verwendete ich einfach die benötigten Informationen, d. H. Die Zahlen in der Liste der Kombinationsfelder. Ich habe auch ein Tastendruckereignis verwendet, um unerwünschte alphanumerische Zeichen herauszufiltern.

Hoffe das hilft.