Ik heb een combobox op een form die als dropdownstyle gewoon dropdown heeft of met andere woorden je kan in de combobox zelf een waarde typen die niet in de lijst voorkomt.
Bij het laden van de form wordt de selectedIndex gezet via code en wordt er databinding toegevoegd met een object. Wanneer de form geladen is kan ik de tekst in de combobox leegmaken en gewoon tabben naar de andere items.
Wanneer ik nu een item uit de dropdownlijst selecteer en achteraf de tekst leegmaak zit ik vast. Ik kan geen andere items op de form activeren...
Iemand enig idee wat hier fout loopt?
Lijkt me alsof het leegmaken niet gelijk is met het deselecteren van het item in de lijst. Maar er moet toch een manier zijn om een lege waarde te selecteren?
Waar het simpelweg op neer komt is dat ik wil dat de gebruiker kan kiezen om niets te selecteren en dus in dit geval de tekst die geselecteerd leeg te maken.
Ik heb al geprobeert door een eigen user control te maken en via de key down te checken of je delete of backspace doet om dan de selectedindex op -1 te zetten. Maar dit werkt ook niet.
Imports System.Windows.Forms
Imports System.Drawing
<ToolboxBitmap(GetType(ComboBox))> _
Public Class VcgCombobox
Inherits ComboBox
Private Sub VcgComboBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Windows.Forms.Keys.Delete OrElse e.KeyCode = Keys.Back Then
MyBase.SelectedIndex = -1
End If
End Sub
End Class
Imports System.Windows.Forms
Imports System.Drawing
<ToolboxBitmap(GetType(ComboBox))> _
PublicClass VcgCombobox
Inherits ComboBox
PrivateSub VcgComboBox_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs)HandlesMe.KeyDown
If e.KeyCode= Windows.Forms.Keys.Delete OrElse e.KeyCode= Keys.BackThen
MyBase.SelectedIndex=-1
EndIf
EndSub
EndClass
Het is makkelijk te simuleren: maak een combobox, steek er stringwaarden in, selecteer een item, maak de tekst leeg en probeer dan iets anders te doen in je form.
Wat je anders ook kan doen is de DropDownStyle van de DropDownList op 'DropDownList' zetten. Je voegt via je databinding je items toe, maar ook een leeg item. Als de style op 'DropDownList' staat kan een gebruiker geen eigen tekst invoeren maar wel een leeg item selecteren als er geen land moet geselecteerd worden.
Ik wil de combobox met dropdownstyle dropdown gaan gebruiken om de waarden die de gebruiker typt op te slaan. Bv mijn tabel land bevat momenteel België en Nederland. Hieruit kan de gebruiker kiezen maar hij kan evengoed Frankrijk typen met als gevolg dat Frankrijk in de landen tabel komt te zitten. Ik wou dit voorzien omdat de gebruiker anders naar het scherm Landen moet gaan, daar een nieuw land toevoegen en dan de form opnieuw moet openen om het nieuwe land te kunnen selecteren en dit omdat het toch maar om 1 waarde gaat nm de naam van het land.
Een dropdownlist vind ik dus niet zo goed omdat je minder flexibel bent als je een nieuwe waarde wil toevoegen en voor sommige basisgegevens is het nogal omslachtig om deze eerst appart te gaan aanmaken.
Ik ga nog wat verder zoeken in de events die afgevuurd worden tijdens het leegmaken, hier moet denk ik toch iets te mee te doen zijn. Vindt het heel jammer dat zoiets niet standaard voorzien is.
Een extra textbox ga ik niet doen, vind ik persoonlijk wat onnodig, dan opteer ik eerder voor een knopje met een "plus" in naast de combobox die dan het scherm "beheer landen" als dialog opent. Als je dit venster dan sluit kan je de items in de combobox gaan refreshen en zit je ongeveer even ver, buiten dat je dan nog altijd niet kan kiezen om geen waarde te selecteren. Maar dat valt misschien dan weer op te lossen met een dummy item in de bindingcollection.
Toch bedankt voor de moeite, mocht nog iemand een idee hebben hoor ik het natuurlijk graag.
Abbas - 04/11/2010 23:16 (laatste wijziging 05/11/2010 00:08)
Crew .NET
Heb even een projectje gemaakt om te zien of ik je goed begrijp. Normaal zou volgende code moeten werken. Ik heb het heel simpel gehouden om maar eens te proberen simuleren.
Edit:
Had eerst niet gezien dat het voor VB.NET was, code stond in C# maar nu staat ze juist.
Public Class Land
Private _id As Integer
Private _code, _naam As String
Public Sub New(ByVal id As Integer, ByVal code As String, ByVal naam As String)
Me.Id = id
Me.Code = code
Me.Naam = naam
End Sub
Public Property Id() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property
Public Property Naam() As String
Get
Return _naam
End Get
Set(ByVal value As String)
_naam = value
End Set
End Property
Public Property Code() As String
Get
Return _code
End Get
Set(ByVal value As String)
_code = value
End Set
End Property
End Class
PublicClass Land
Private _id AsInteger
Private _code, _naam AsString
PublicSubNew(ByVal id AsInteger, ByVal code AsString, ByVal naam AsString)
Public Class MainForm
Private _landenLijst As List(Of Land)
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_landenLijst = New List(Of Land)
_landenLijst.Add(New Land(1, "Be", "Belgie"))
_landenLijst.Add(New Land(1, "Nl", "Nederland"))
_landenLijst.Add(New Land(1, "Fr", "Frankrijk"))
LandenComboBox.DataSource = _landenLijst
LandenComboBox.ValueMember = "Id"
LandenComboBox.DisplayMember = "Naam"
LandenComboBox.SelectedIndex = -1
End Sub
Private Sub LandenComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LandenComboBox.SelectedIndexChanged
UpdateControls(LandenComboBox.SelectedIndex.Equals(-1) = False)
End Sub
Private Sub UpdateControls(ByVal enable As Boolean)
CodeTextBox.Enabled = enable
RandomCheckBox.Enabled = enable
OkButton.Enabled = enable
End Sub
Private Sub LandenComboBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles LandenComboBox.TextChanged
If (String.IsNullOrEmpty(LandenComboBox.Text)) Then
LandenComboBox_SelectedIndexChanged(sender, e)
Else
UpdateControls(True)
End If
End Sub
End Class
PublicClass MainForm
Private _landenLijst As List(Of Land)
PrivateSub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)HandlesMyBase.Load
_landenLijst =New List(Of Land)
_landenLijst.Add(New Land(1, "Be", "Belgie"))
_landenLijst.Add(New Land(1, "Nl", "Nederland"))
_landenLijst.Add(New Land(1, "Fr", "Frankrijk"))
LandenComboBox.DataSource= _landenLijst
LandenComboBox.ValueMember="Id"
LandenComboBox.DisplayMember="Naam"
LandenComboBox.SelectedIndex=-1
EndSub
PrivateSub LandenComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles LandenComboBox.SelectedIndexChanged
Als ik het goed zie ga je dus gewoon je andere controls extra gaan enablen?
Ik heb dit eens even snel getest door in mijn selectedIndexChanged event bij index = -1 een item te enablen maar dit doet niet echt iets uit.
Misschien zit er nog een verschil doordat ik databinding heb op die combobox?
Bij mij zijn de andere items niet gedisabled of zo het is gewoon alsof de combobox in een of andere status zit waardoor je verplicht bent een item te selecteren. Ik zou zeggen ik post mijn project maar denk dat het iets te groot zal zijn. Ik zal trachten een appart project aan te maken en het daarin te simuleren en dit te posten.