[VB.net] listbox aanpassen vanop ander form

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • trees
  • Registratie: November 2010
  • Laatst online: 19-09 16:42
Beste,

als VB.net beginneling zit ik met een probleempje, ik probeer zo uitgebreid mogelijk te schetsen :)

ik heb een form (frmusers) met daarop een listbox (lbUsers). Deze listbox geeftt een lijst weer van gebruikers. In de form_load roep ik LoadUsersInListBox() op
code:
1
2
3
4
5
6
7
8
9
10
Public Sub LoadUsersInListBox()
        lbUsers.Items.Clear()
        Users.GetAllUsers()
        dvUsers = New DataView(myDataSet.Tables("users"))
        For i As Integer = 0 To dvUsers.Count - 1
            lbUsers.Items.Add(dvUsers.Item(i).Item("name").ToString)
        Next
        lbUsers.SelectedItems.Clear()
        lbUsers.SelectedIndex = 0
    End Sub


Verder heb ik op dit form add/edit/remove knoppen toegevoegd..
Bij remove doe ik een delete van het desbetreffende id en daarna roep ik opnieuw de LoadUsersInListBox() op.

Zover geen probleem, werkt zoals het moet :)

Voor de edit en de add wil ik echter een nieuw form gebruiken.
Ik geef even het vb van een add, maar probleem bij edit is hetzelfde.

op frmusers roep ik bij het klikken op de add knop volgende code op
code:
1
2
Dim frm As New frmAddEditUser("newid")
frm.Show()

(frmAddEditUser krijgt ofwel "newid" binnen indien het over add gaat, een bestaand id indien het over een edit gaat)

frmAddEditUser komt tevoorschijn, ik vul gegevens in en duw op mijn save button.


Mijn probleem: de gegevens worden wel degelijk opgeslagen, maar de listbox op frmUsers krijg ik blijkbaar onmogelijk gerefreshed..
code:
1
2
3
Users.adduser(*lijst van gegevens user*)
frmUsers.LoadUsersInListBox()         (LoadUsersInListBox is ondertussen public gemaakt)
me.close()


De originele inhoud van de listbox blijft staan tot ik frmUsers sluit en weer open, dan zijn de gegevens uiteraard correct.

Wat heb ik al getest:
- ik stuur gewoon de gegevens van de nieuwe user (van frmAddEditUser ) terug door naar mijn frmUsers, doe daar de users.adduser en een LoadUsersInListBox, zonder succes.. Als ik debug zie ik wel de nieuwe, correcte gegevens passeren, maar de listbox inhoud blijft idem
- ik heb een 2e listbox aangemaakt op mijn frmUsers, die ik laat opvullen met de gegevens die ik terugkrijg van frmAddEditUser (dus geen aanpassing op lbUsers).. Opnieuw zie ik de records binnenkomen in debug mode, maar de 2e listbox blijft leeg..
- ik heb getest om in frmAddEditUser na het adden van de users een lbusers.items.clear te doen, en zelfs dat komt niet door!

Ik heb mij al zot gezocht op internet, maar kom er niet uit.. Waarschijnlijk een grove beginnersfout, maar ik zou enige hulp apprecieren! Ik hoop dat ik zo volledig mogelijk ben geweest met mijn informatie en alvast bedankt voor de hulp!

Trees

Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 19-09 10:04
Maak een event aan dat je listbox met users wordt gerefreshed zo gauw de add/delete-form wordt gesloten? :)

Acties:
  • 0 Henk 'm!

  • trees
  • Registratie: November 2010
  • Laatst online: 19-09 16:42
ik heb eens getest en de frmUsers.LoadUsersInListBox() opgeroepen in de me.formclosing van het 2e form, maar zonder succes.

Alvast bedankt om de lange uitleg te lezen en je reactie :)

[ Voor 20% gewijzigd door trees op 19-11-2010 23:21 ]


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
adyta schreef op vrijdag 19 november 2010 @ 23:12:
Maak een event aan dat je listbox met users wordt gerefreshed zo gauw de add/delete-form wordt gesloten? :)
Niet echt een handige oplossing imho? Stel dat hij dat wilt bij meerdere forms, dat moet elke 'entry' ingeprogrammeerd worden.

Hier is het idee uitgelegd (sorry C++ code http://accu.org/index.php/journals/488). Ik had een bron voor C# maar kan die niet zo 123 vinden.

Wikipedia to the rescue: Wikipedia: Observer pattern . Ik lees dat je een beginneling bent, geen zorgen als je het niet volledig begrijpt (kan even duren). Maar dit is reuze handig!

[ Voor 20% gewijzigd door mrFoce op 19-11-2010 23:29 ]


Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 19-09 10:04
Je moet dan de listener voor dat event in je form zetten waar je je listbox hebt staan, en je add/remove-form het event laten raisen. Of had je dat zo gedaan?
mrFoce schreef op vrijdag 19 november 2010 @ 23:27:
[...]

Niet echt een handige oplossing imho? Stel dat hij dat wilt bij meerdere forms, dat moet elke 'entry' ingeprogrammeerd worden.
Als hij dat bij meerdere forms wilt, kan hij bij elk form een listener inbouwen en klaar is Kees. :)

[ Voor 53% gewijzigd door Mint op 19-11-2010 23:31 ]


  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
adyta schreef op vrijdag 19 november 2010 @ 23:30:
Je moet dan de listener voor dat event in je form zetten waar je je listbox hebt staan, en je add/remove-form het event laten raisen. Of had je dat zo gedaan?


[...]


Als hij dat bij meerdere forms wilt, kan hij bij elk form een listener inbouwen en klaar is Kees. :)
Gebruik wat je prettig vind :)

jammer altijd dat je na het geven van een 'mogelijke' oplossing, nooit meer wat hoort van de TS. Moedigt niet echt aan om de volgende keer weer te posten in het betreffende topic.

  • Ellos
  • Registratie: Oktober 2008
  • Laatst online: 17-09 17:22
je kunt ook een nieuwe datasource aanmaken en die koppelen aan je listbox, even de tostring functie overriden zodat hij de juiste naam weergeeft en klaar, instant update, heb je dat inladen ook niet meer nodig :P

Acties:
  • 0 Henk 'm!

  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 18:29
Is het niet veel makkelijker om het 'subform' modaal te openen en daarna de listbox opnieuw te laden?:
code:
1
2
3
Dim frm As New frmAddEditUser("newid")
frm.ShowDialog()
LoadUsersInListBox()


ShowDialog returned pas als het formulier gesloten word...

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Wat ik altijd doe in zulke gevallen is wat Sikkek ook aangeeft: Je moet je add/update-form gewoon dom houden! En dan de add/update doorvoeren in je originele form.

Ik doe het even in C#, is makkelijker voor mij.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Klik-event van je add-button: */
private void buttonAdd_Click(object sender, EventArgs e)
{
    this.addUser();
}

private void addUser()
{
   /* Ik geef altijd een lijstje mee met huidige users, zodat ik kan scannen of een naam niet al bezet is.
       Bovendien zet ik een modal form altijd in using zodat het disposed wordt als ik er klaar mee ben. */
    using(FormAddEditUser frm = new FormAddEditUser("newid", List<User> currentUsers))
    {
        if (frm.ShowDialog() != DialogResult.OK) return;
        /* Voeg hier de daadwerkelijke functionaliteit toe voor het toevoegen van een user, maak hier gebruik
            van het feit dat je form nog beschikbaar is. Maak van bijvoorbeeld UserName een property. 
            Deze property kun je dan opvragen en opslaan in je lijst. */
    }
}


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Hier een klein voorbeeldje van je add/edit-form */
public class FormAddEditUser 
{
    public string UserName { get { return this.textBoxUserName.Text; } set { this.textBoxUserName.Text = value; } }

    private string userId;
    private List<User> currentUsers;

    public FormAddEditUser(string userId, List<User> currentUsers)
    {
        InitializeComponents();

        this.userId = userId;
        this.currentUsers = currentUsers;
    } 
}


Het komt er dus op neer dat je het daadwerkelijk toevoegen in je oorspronkelijke form moet doen en in je Add/Edit-form alleen de nodige gegevens invoert. Als je daar properties van maakt, kun je ze opvragen als je form geclosed is. Het closen van een form is namelijk niet hetzelfde als het disposen ervan. Bij een close wordt het venstertje gesloten, maar blijven de waarden beschikbaar. Dit is erg handig voor domme invul-forms zoals hier.
Pagina: 1