login  Naam:   Wachtwoord: 
Registreer je!
 Forum

combobox probleempje

Offline cloudstrife - 03/11/2010 17:51
Avatar van cloudstrifePHP beginner 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?

9 antwoorden

Gesponsorde links
Offline Abbas - 03/11/2010 22:41
Avatar van Abbas Gouden medaille

Crew .NET
Code?
Offline cloudstrife - 04/11/2010 10:04
Avatar van cloudstrife PHP beginner Komt niet echt code aan te pas. Enkel het invullen van de datasource. Het is echt een probleem in de user interface zelf.

Code voor het opvullen van de datasource + invullen van de databinding:
In de form load:
  1. cbxLand.DataSource = Business.BusinessController.Load(Of Business.Land)()
  2. cbxLand.ValueMember = "Id"
  3. cbxLand.DisplayMember = "Naam"
  4.  
  5. cbxLand.SelectedIndex = -1

Setten en resetten van de databinding:

  1. cbxLand.DataBindings.Clear()
  2. cbxLand.DataBindings.Add("SelectedValue", DirectCast(WaterBindingSource.Current, Business.Water), "Landid", True, DataSourceUpdateMode.OnPropertyChanged, String.Empty)


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.


  1. Imports System.Windows.Forms
  2. Imports System.Drawing
  3. <ToolboxBitmap(GetType(ComboBox))> _
  4. Public Class VcgCombobox
  5. Inherits ComboBox
  6. Private Sub VcgComboBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  7. If e.KeyCode = Windows.Forms.Keys.Delete OrElse e.KeyCode = Keys.Back Then
  8. MyBase.SelectedIndex = -1
  9.  
  10. End If
  11. End Sub
  12.  
  13. End Class


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.
Offline Abbas - 04/11/2010 16:57
Avatar van Abbas Gouden medaille

Crew .NET
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.
Offline cloudstrife - 04/11/2010 18:32
Avatar van cloudstrife PHP beginner 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.
Offline Abbas - 04/11/2010 18:55
Avatar van Abbas Gouden medaille

Crew .NET
Ok snap ik. Anders kan je met de optie werken zoals ik al zei en dan een TextBox voorzien om een nieuw land te laten toevoegen door de gebruiker?
Offline cloudstrife - 04/11/2010 20:01
Avatar van cloudstrife PHP beginner 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.
Offline Abbas - 04/11/2010 23:16 (laatste wijziging 05/11/2010 00:08)
Avatar van Abbas Gouden medaille

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. 

Land.vb
  1. Public Class Land
  2.  
  3. Private _id As Integer
  4. Private _code, _naam As String
  5.  
  6. Public Sub New(ByVal id As Integer, ByVal code As String, ByVal naam As String)
  7. Me.Id = id
  8. Me.Code = code
  9. Me.Naam = naam
  10. End Sub
  11.  
  12. Public Property Id() As Integer
  13. Get
  14. Return _id
  15. End Get
  16. Set(ByVal value As Integer)
  17. _id = value
  18. End Set
  19. End Property
  20.  
  21.  
  22. Public Property Naam() As String
  23. Get
  24. Return _naam
  25. End Get
  26. Set(ByVal value As String)
  27. _naam = value
  28. End Set
  29. End Property
  30.  
  31. Public Property Code() As String
  32. Get
  33. Return _code
  34. End Get
  35. Set(ByVal value As String)
  36. _code = value
  37. End Set
  38. End Property
  39.  
  40. End Class

MainForm.vb
  1. Public Class MainForm
  2.  
  3. Private _landenLijst As List(Of Land)
  4.  
  5. Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  6.  
  7. _landenLijst = New List(Of Land)
  8. _landenLijst.Add(New Land(1, "Be", "Belgie"))
  9. _landenLijst.Add(New Land(1, "Nl", "Nederland"))
  10. _landenLijst.Add(New Land(1, "Fr", "Frankrijk"))
  11.  
  12. LandenComboBox.DataSource = _landenLijst
  13. LandenComboBox.ValueMember = "Id"
  14. LandenComboBox.DisplayMember = "Naam"
  15. LandenComboBox.SelectedIndex = -1
  16.  
  17. End Sub
  18.  
  19. Private Sub LandenComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LandenComboBox.SelectedIndexChanged
  20.  
  21. UpdateControls(LandenComboBox.SelectedIndex.Equals(-1) = False)
  22.  
  23. End Sub
  24.  
  25. Private Sub UpdateControls(ByVal enable As Boolean)
  26.  
  27. CodeTextBox.Enabled = enable
  28. RandomCheckBox.Enabled = enable
  29. OkButton.Enabled = enable
  30.  
  31. End Sub
  32.  
  33. Private Sub LandenComboBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles LandenComboBox.TextChanged
  34.  
  35. If (String.IsNullOrEmpty(LandenComboBox.Text)) Then
  36. LandenComboBox_SelectedIndexChanged(sender, e)
  37. Else
  38. UpdateControls(True)
  39. End If
  40.  
  41. End Sub
  42.  
  43. End Class
Offline cloudstrife - 05/11/2010 07:24
Avatar van cloudstrife PHP beginner 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.
Offline Abbas - 05/11/2010 14:05
Avatar van Abbas Gouden medaille

Crew .NET
Ok 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.187s