[VISUAL C#] Listview ververst niet zichtbaar

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het project
In een listview laad ik gegevens uit een SQL server tabel. Deze zijn te refreshen met een button.
Door een extra form kunnen de gegevens gedetaileerder getoond worden. OP dat form zit een button waarmee de regel verwijderd kan worden.

Wat werkt wel / niet
Wel: Listview vullen, refreshen. Extra form openen en button delete uitvoeren. De regel wordt dan ook verwijderd.
Niet: Listview refreshen na de gedelete regel

Stukken uit code
Class om listview te vullen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public void DisplayLockTable()
        {

            SqlConnection myConnection = new SqlConnection("...");

            // open connection

            try
            {
                SqlDataReader myReader = null;
                SqlCommand myCommand = new SqlCommand("SELECT ...", myConnection);

                myReader = myCommand.ExecuteReader();

                listView2.Items.Clear();

                ListViewItem lv2Item = new ListViewItem();
                int i = 1;

                while (myReader.Read())
                {
                    lv2Item = listView2.Items.Add("");
                    ...

                   // Listview vullen
                }

                if (listView2.Items.Count == 0)
                {
                    MessageBox.Show("Er zijn geen gebruikers in deze tabel.", "PCMLOCKTABLE", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK); [s][/s]  
                }


                if (button4.Text == "Open...")
                {
                    button4.Text = "Refresh";
                }

            }
            catch
            {
                ErrorHandler eH = new ErrorHandler(1004, 100);
                eH.printError();
            }

            // Close connection
        }

Class om regel te deleten:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public class DeleteRow : Form1
    {
        private string keywaarde;

        // Constructor
        public DeleteRow(string keywaarde)
        {
            this.keywaarde = keywaarde;
        }

        // Method
        public void DeleteUserRow()
        {

            SqlConnection myConnection = new SqlConnection("...");

            // Open connection

            try
            {
                SqlCommand myCommand = new SqlCommand("DELETE ...", myConnection);
                myCommand.ExecuteNonQuery();

                DisplayLockTable();    <--- om opnieuw de listview te vullen (refreshen dus)

                // Close connection
            }
            catch (Exception eR)
            {
                MessageBox.Show(eR.ToString());
                ErrorHandler eH = new ErrorHandler(1005, 100);
                eH.printError();
            }
        }
    }


Probleem
Zoals ik al zei, lukt het allemaal prima om een rij de verwijderen en om opnieuw de DisplayLocktable() aan te spreken. Alleen leest hij niet opnieuw de gegevens in de listView.
Als ik de knop refresh gebruik, werkt het prima, maar als ik het via DeleteRow() doe, dan doet hij het niet.
De MessageBox die de melding "Er zijn geen gebruikers in deze tabel." geeft, verschijnt gewoon op mijn scherm. Dus de rij is verwijderd en er zijn geen gegevens meer in de tabel. Alleen blijft die rij wel op mijn scherm staan.

Wat ik zelf al heb geprobeerd...
Het verschuiven van het "moment" waarop ik de lijst refresh. Aanroepen vanuit de Delete class, aanroepen op het moment dat het extra form sluit, aanroepen vanuit dat extra form, etc.
Extra MessageBoxes tussen de code om te zien of daadwerkelijk alles wel nagelopen wordt als ik DisplayLocktable() aanspreek. En dat is zo.
Een focus gezet op de listview voordat ik hem refresh... ik ben lost.

Vraag
Hoe kan ik ook daadwerkelijk zichtbaar mijn listview opnieuw vullen? Achter de schermen gebeurd het dus blijkbaar wel. (moet ik mijn code misschien ergens laten "sleepen"?)

Acties:
  • 0 Henk 'm!

  • increddibelly
  • Registratie: Juni 2003
  • Laatst online: 26-07 18:32
ik zie nergens een regel:

code:
1
lv2Item.Refresh ()


edit: typo's O+

[ Voor 32% gewijzigd door increddibelly op 20-10-2006 10:32 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Mag ik vragen waarom DeleteRow overerft van Form ?
Toon je een andere form (een DeleteRow form) als je een regel wilt verwijderen ?
Ik zie dat je daar ook DisplayLockTable aanroept, maar die method zit waarschijnlijk in een andere form ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb er een...
C#:
1
listView2.Refresh();

...aan toegevoegd, zowel een keer geprobeerd vanuit de Delete Class en zowel in de DisplayLocktable Class zelf, maar helaas werkt ook dit niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op vrijdag 20 oktober 2006 @ 10:42:
Mag ik vragen waarom DeleteRow overerft van Form ?
Toon je een andere form (een DeleteRow form) als je een regel wilt verwijderen ?
Ik zie dat je daar ook DisplayLockTable aanroept, maar die method zit waarschijnlijk in een andere form ?
Ik toon inderdaad een extra form als ik die rij wil deleten.
Het overerven doe ik omdat ik dan vanuit de DeleteRow Class de DisplayLocktable direct kan aanspreken. Dit overerven heb ik eigenlijk gedaan om te testen of het dan wel werkt.
Die overerving had ik eerst niet en maakt ik gewoon eerst een nieuw object Form1 aan.

Acties:
  • 0 Henk 'm!

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 25-08 15:44
Als je een breakpoint zet op "DisplayLockTable()"? Komt hij wel in die functie? Roept hij ook daadwerkelijk de ListView.Refresh() aan?

Windows Phone Apps: Belstatus, Pinautomaten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Piels schreef op vrijdag 20 oktober 2006 @ 11:03:
Als je een breakpoint zet op "DisplayLockTable()"? Komt hij wel in die functie? Roept hij ook daadwerkelijk de ListView.Refresh() aan?
Ik begrijp je vraag denk ik niet zo goed... :?
Waar moet ik precies dat breakpoint zetten om te testen?

Acties:
  • 0 Henk 'm!

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 25-08 15:44
In regel 24 van je DeleteRow class een breakpoint zetten.

En even kijken waar in je code het mis gaat.
Misschien ook even een Watch ergens op zetten?

[ Voor 43% gewijzigd door Piels op 20-10-2006 11:27 ]

Windows Phone Apps: Belstatus, Pinautomaten


Acties:
  • 0 Henk 'm!

  • Oezie Woezie
  • Registratie: December 1999
  • Niet online

Oezie Woezie

Pim. is de beste

waarom geen sqldataadapter gebruiken en een dataset? en dan een listview met datasource?

een mooi Tshirt met Pim. is de beste enzo


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Dus, je hebt een form met daarop een listview.
Als je een rij wilt verwijderen, selecteer je die rij, klik je op een button. Die button zorgt ervoor dat er een andere form wordt geopend, waar je waarschijnlijk moet bevestigen ?

code:
1
2
3
4
5
6
7
8
9
10
11
// code in form met listview
private void DeleteButton_Click( object sender, EventArgs e )
{
    DeleteRowForm frmDelete = new DeleteRowForm();
   
    if( frmDelete.ShowDialog() == DialogResult.OK )
    {
        refreshlistview();
    }

}

Waarom doe je het deleten zelf trouwens in die andere form ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Alles gebeurd vanaf het Main form. Zowel dat exra form aanroepen als de rij zelf deleten.

Class om form aan te roepen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class ShowForm : Form1
    {
        Form3 f3 = new Form3();

        private string datum;
        private string inlognaam;
        private string tabelnaam;
        private string keywaarde;
        private string computer;

        // Constructor
        public ShowForm(string datum, string inlognaam, string tabelnaam, string keywaarde, string computer)
        {
            this.datum = datum;
            this.inlognaam = inlognaam;
            this.tabelnaam = tabelnaam;
            this.keywaarde = keywaarde;
            this.computer = computer;
        }
        
        // Method
        public void OpenForm()
        {
            f3.label11.Text = datum;
            f3.label12.Text = inlognaam;
            f3.label13.Text = tabelnaam;
            f3.label14.Text = keywaarde;
            f3.label15.Text = computer;

            if (f3.ShowDialog() == DialogResult.OK)
            {
                if (MessageBox.Show("Weet u zeker dat u de geslecteerde regel wilt verwijderen?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    DeleteRow dRow = new DeleteRow(keywaarde);
                    dRow.DeleteUserRow();

                    DisplayLockTable();    // <--------- dit is dus "refresh"
                }
            }
        }
    }


Die "refresh" heb ik dus op de plek gezet waar je aangeeft. Na het accepteren. Maar helaas... hij roept de functie wel weer goed aan (ik krijg de messagebox "Er zijn geen gebruikers... etc") die in die functie staat, maar hij laat de regel gewoon staan.

Als ik daarbna "hard" op de knop Refresh druk (waardoor hij weer DisplayLockTable() aanroept, dan is mijn listview wel leeg.

ps: dat breakpoint geeft me ook meldingen waar ik niet mee kan. Moet ik die posten?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Als je een breakpoint op regel 37 zet, en je stept into die DisplayLockTable, wat zie je dan gebeuren ?

Trouwens, het is dus totaal onnodig dat die DeleteRow class van een Form overerft; het is zelfs onnodig om daar een aparte class voor te bouwen. Een method volstaat ook al.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 25-08 15:44
Verwijderd schreef op vrijdag 20 oktober 2006 @ 11:57:

ps: dat breakpoint geeft me ook meldingen waar ik niet mee kan. Moet ik die posten?
Ja.
Heb je ook een Watch ergens gebruikt?

Wat misschien ook wel duidelijker is voor je code. Als je je private variable vooraf laat gaan met een _

C#:
1
2
3
4
5
private string _Datum; 
private string _Inlognaam; 
private string _Tabelnaam; 
private string _Keywaarde; 
private string _Computer; 


Zo is het allemaal wat makkelijker uit elkaar te houden :)

[ Voor 45% gewijzigd door Piels op 20-10-2006 12:33 ]

Windows Phone Apps: Belstatus, Pinautomaten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op vrijdag 20 oktober 2006 @ 12:15:
Als je een breakpoint op regel 37 zet, en je stept into die DisplayLockTable, wat zie je dan gebeuren ?

Trouwens, het is dus totaal onnodig dat die DeleteRow class van een Form overerft; het is zelfs onnodig om daar een aparte class voor te bouwen. Een method volstaat ook al.
Dat laatste ben ik met je eens. Die overerving had ik er al uitgesloopt. Die was inderdaad onzin. Die class zou ook als method kunnen inderdaad. Had ik eerst ook, maar goed.

Zouden jullie mij misschien iets meer kunnen helpen met al die breakpoints, watch, step into etc. etc. Heb daar nogal weing kaas van gegeten.

Ik kan ze wel aanmaken, geen probleem. Ik kan alleen niets met de meldingen die ik krijg.


Ik krijg bijvoorbeeld dit op mijn breakpoint op regel 37...
code:
1
2
3
4
5
6
>   AdminTool.exe!AdminTool.ShowForm.OpenForm() Line 425    C#
    AdminTool.exe!AdminTool.Form1.DisplayUserDetailsLocktable() Line 336 + 0xa bytes    C#
    AdminTool.exe!AdminTool.Form1.listView2_DoubleClick(object sender = {System.Windows.Forms.ListView, Items.Count: 1, Items[0]: ListViewItem: {}}, System.EventArgs e = {System.EventArgs}) Line 381 + 0x7 bytes  C#
    [External Code] 
    AdminTool.exe!AdminTool.Program.Main() Line 17 + 0x1a bytes C#
    [External Code]


Hoe kan ik zien "wat er mis gaat"? Want met step into etc. loopt hij gewoon door mijn method heen.

Acties:
  • 0 Henk 'm!

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 25-08 15:44
Wat doet een breakpoint :)

Als je een breakpoint zet ergens in je code, zal het programma als het gerund wordt blijven hangen op het breakpoint. Op dat punt kun je stap voor stap door je code heen gaan, en zo dus ook nagaan of de juiste stappen worden genomen zoals jij ze in gedachte had.
Daarnaast kun je met een breakpoint ook kijken wat de waardes zijn van bepaalde variable of wat de waardes zijn van bv je ListView.

Met een Watch kun je dus bekijken wat de waardes zijn van het object waar je een Watch op zet. Tijdens het breakpoint even rechtermuis knop op hetgeen waar je een watch op wilt hebben.

Windows Phone Apps: Belstatus, Pinautomaten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goed, de uitleg over breakpoints en watches is duidelijk.
Ik ga er nu meteen wat mee doen, en dan op de goede manier hopelijk.

I'll be back...

Acties:
  • 0 Henk 'm!

Verwijderd

Ik snap het ontwerp van je oplossing niet helemaal, in welke klasse zit de methode DisplayLockTable()? Ik neem aan dat dit Form1 is, want dat zou verklaren dat je code uberhaubt compileert. De klasse DeleteRow heeft namelijk zelf geen methode DisplayLockTable, en als deze wordt aangeroepen (zoals in het eerste voorbeeld) als deze klasse een subklasse is van Form1 wordt de methode van de parent uitgevoerd. Het probleem wat je dan hebt is natuurlijk dat de call DisplayLockTable bij de verkeerde form wordt uitgevoerd.
Dit is op te lossen door de methode DeleteUserRow() een parameter met als type Form1 te geven en daarvan de methode DisplayLockTable aan te roepen. Of je kunt de methode DeleteUserRow weer gewoon in de klasse Form1 zetten, wat voor het overzicht zowiezo aan te raden is.

En ik snap het volgende stuk code niet:
C#: onbekend.c
1
2
3
4
5
6
7
8
9
10
11
listView2.Items.Clear(); 

ListViewItem lv2Item = new ListViewItem(); 
int i = 1; 

while (myReader.Read()) 
{ 
   lv2Item = listView2.Items.Add(""); 

   // Listview vullen 
}


Ik zou zoiets verwachten als dit:
C#: onbekend.c
1
2
3
4
5
6
7
8
9
ListViewItem tempLvItem;

while (myReader.Read()) {
   tmpLvItem = new ListViewItem(); 
   // Dit moet waarschijnlijk voor ieder item want anders heb je alleen een referentie.
   
   // tmpLvItem verder vullen met gegevens uit myReader 
   ListView2.items.add(tmpLvItem); 
}

Ik ken geen C# dus geen idee of de syntax en methodenamen e.d. kloppen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de tips Backer! Het is gelukt.

Ik heb de class ShowForm overboord gegooid en maak nu een object van Form3 aan binnen de class Form1. Daardoor gaat de "call" nu wel goed en refresht hij nu wel netjes mijn listView.

De class DeleteRow ga ik ook nog even omzetten naar een method en wat betreft die listView.Items ga ik ook nog even naar kijken.

*Thanks all...*
Pagina: 1