Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 10:35 Der er 38 kommentarer og
1 løsning

Refresh en listviewbox

Jeg har en listviewbox, der viser indeholdet af en database. Men når man opretter en ny bruger inde i programmet, så skal listviewboxen også opfriskes. Det skulle ikke være særligt svært, men jeg kan ikke få den til det.

Her er min metode der opretter listviewboxen

public void Main_Form_Load(object sender, System.EventArgs e)
        {
            this.lwl_BrugerOversigt.Items.Clear();
            ArrayList list = DataGateway.GetAll();
            foreach(Person r in list)
            {
                System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
                                                                                                                        "" + r.F1 + "",
                                                                                                                        "" + r.F2 + "",
                                                                                                                        "" + r.F3 + "",
                                                                                                                        "" + r.F4 + "",
                                                                                                                        "" + r.F5 + "",
                                                                                                                        "" + r.F6 + "",    }, -1);
                this.lwl_BrugerOversigt.Items.AddRange(new System.Windows.Forms.ListViewItem[] {listViewItem1});
            }
           
           
        }

Hva skal jeg gøre udover og kalde den metode igen? For og opfriske listviewboxen
Avatar billede dr_chaos Nybegynder
10. november 2005 - 10:43 #1
prøv med  this.lwl_BrugerOversigt.Refresh(); eller
  this.lwl_BrugerOversigt.Update();
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 10:59 #2
Nej det hjælper heller ikke. Jeg forstår det ikke, det metoden gør er jo og slette alt der er i listviewboxen og trække alle data ud af databsen igen og så smide dem i listboxen på ny
Avatar billede dr_chaos Nybegynder
10. november 2005 - 11:01 #3
prøv at invalidate den.
Avatar billede spif2001 Nybegynder
10. november 2005 - 11:06 #4
Er det en anden tråd du kalder fra?
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 11:12 #5
Jeg kalder den fra en anden fil jeg har inkluderet i mit projekt. Men der eksekvere fint metoden, når jeg kalder den. invalidate??
Avatar billede spif2001 Nybegynder
10. november 2005 - 11:15 #6
kald Invalidate() metoden på this.lwl_BrugerOversigt
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 12:02 #7
Sorry jeg forstår ikke hva i mener... Har ikke programmeret i ret lang tid. Har ikke en metode der hedder invalidate
Avatar billede dr_chaos Nybegynder
10. november 2005 - 12:18 #8
prøv med this.lwl_BrugerOversigt.Invalidate()
Avatar billede spif2001 Nybegynder
10. november 2005 - 12:19 #9
this.lwl_BrugerOversigt.Invalidate();

Invalidate er en metode controller normalt har.
Avatar billede spif2001 Nybegynder
10. november 2005 - 12:20 #10
public void Main_Form_Load(object sender, System.EventArgs e)
        {
            this.lwl_BrugerOversigt.Items.Clear();
            ArrayList list = DataGateway.GetAll();
            foreach(Person r in list)
            {
                System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
                                                                                                                        "" + r.F1 + "",
                                                                                                                        "" + r.F2 + "",
                                                                                                                        "" + r.F3 + "",
                                                                                                                        "" + r.F4 + "",
                                                                                                                        "" + r.F5 + "",
                                                                                                                        "" + r.F6 + "",    }, -1);
                this.lwl_BrugerOversigt.Items.AddRange(new System.Windows.Forms.ListViewItem[] {listViewItem1});
            }
         
          this.lwl_BrugerOversigt.Invalidate();
        }
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 12:24 #11
Det ændrer ikke noget. Den vil stadig opfriske den listview
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 12:32 #12
Den vil stadig ikke opfriske den listviewbox. Synes egentligt det er lidt mærkelig, den gør det i en anden form i programmet, hvor man søger efter brugere. Den ændrer den fint brugerne. Men der ændrer jeg selvfølgelig også i sql sætningerne
Avatar billede spif2001 Nybegynder
10. november 2005 - 12:36 #13
er det ikke din GetAll metode der returnerer forkert så - check det den returnerer nu også er det du forventer.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 12:42 #14
Den burde da returnere det rigtige. Den opfrisker jo listen hver gang man starter programmet. Så det burde da være i orden.

Her er koden til klassen

public class DataGateway
    {
        public static ArrayList GetAll()
        {
            Splashscreen sp = new Splashscreen();
            sp.Show();
                   
            string MyConnection = "server=127.0.0.1;uid=root;" +
                "pwd=kommet;database=brugere;";
           
            //Laver Forbindelse til databasen
            MySql.Data.MySqlClient.MySqlConnection Connect;
            Connect            = new MySql.Data.MySqlClient.MySqlConnection();
            Connect.ConnectionString = MyConnection;
           
            Connect.Open();//Åbner forbindelse til databasen
            MySql.Data.MySqlClient.MySqlCommand Command = new MySql.Data.MySqlClient.MySqlCommand("SELECT id,First_Name,Last_Name,Adresse,City,Birth FROM bruger", Connect);
            ArrayList list = new ArrayList();
            MySql.Data.MySqlClient.MySqlDataReader rdr = Command.ExecuteReader();
            sp.Close();
            while(rdr.Read())
            {
                list.Add(new Person((int)rdr[0], (string)rdr[1], (string)rdr[2], (string)rdr[3], (string)rdr[4], (int)rdr[5]));
            }
            rdr.Close();
            Connect.Close();
            return list;
           
        }
    }
Avatar billede dr_chaos Nybegynder
10. november 2005 - 12:50 #15
er brugeren kommet ned i databasen ?
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 13:08 #16
Ja jeg kan se den bruger jeg opretter, med det samme i MySql front. Og jeg kan også se den splashscreen jeg har ganske hurtigt, som ligger i metoden GetAll()
Avatar billede spif2001 Nybegynder
10. november 2005 - 13:10 #17
og hvis du sætter et breakpoint på linien :

ArrayList list = DataGateway.GetAll();

går et step frem, ligger den Person så i ArrayListen?
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 13:41 #18
Den burde da ligge i arraylisten
Avatar billede dr_chaos Nybegynder
10. november 2005 - 13:44 #19
prøv at tjekke længden på din arrayliste før og efter du tilføjer personen til databasen og se om ændringen registreres i arraylisten.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 13:53 #20
Hvordan tjekker man længden på sådan en arraylist
Avatar billede spif2001 Nybegynder
10. november 2005 - 13:59 #21
list.Count;

giver dig antallet af objekter i listen
Avatar billede dr_chaos Nybegynder
10. november 2005 - 14:00 #22
snøft to slow :)
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:03 #23
Arraylisten passer fint. Hver gang jeg opretter en bruger, så kommer der en ekstra. Og sletter jeg en så er der en mindre. Så må det vel være den listviewbox den er gal med???
Avatar billede spif2001 Nybegynder
10. november 2005 - 14:06 #24
du bruger AddRange. Er det nødvendigt?

I stedet for:

this.lwl_BrugerOversigt.Items.AddRange(new System.Windows.Forms.ListViewItem[] {listViewItem1});

Kan du skrive:

this.lwl_BrugerOversigt.Items.Add(listViewItem1);

eller den eksisterer måske ikke på en ListView?
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:13 #25
Jo det kan jeg sagtens nøjes med. Men det ændrer stadig ikke på noget. Den vil stadig ikke opfriske den listviewbox
Avatar billede spif2001 Nybegynder
10. november 2005 - 14:17 #26
hmmm...

Jeg kan æj hitte problemet.

Prøver lige med tråden igen:

Den der kalder Main_Form_Load metoden, er det noget der kør i en seperat tråd (Thread)?

Hvis det er det, er det nemlig nødvendigt at opdatere en Form ved hjælp af delegates og Formens Invoke() metode.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:19 #27
Den der kalder Main_Form_Load metoden, er en metode fra en anden form
Main.cs

private void menuItem7_Click(object sender, System.EventArgs e)
        {
            Main_Form upt = new Main_Form();
            upt.Main_Form_Load(this, e);
                }
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:20 #28
Og Main_Form_Load er en child af Main.cs som er MDI container
Avatar billede spif2001 Nybegynder
10. november 2005 - 14:27 #29
hvornår laver du Show() på den form?

private void menuItem7_Click(object sender, System.EventArgs e)
        {
            Main_Form upt = new Main_Form();
            upt.Main_Form_Load(this, e);
                }
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:32 #30
Det gør jeg så snart jeg åbner Main.cs så ligger Main_Form.cs og fylder det meste af skærm billedet. Jeg bliver nød til og have den ekstra form, for hvis jeg ligger den listviewbox direkte på selve MDI formen altså Main.cs så får jeg det problem at listviewboxen ligger over andre forme jeg har lyst til og åbne som childs af main.cs

Her åbner jeg får MDI child Main_Form.cs. Koden ligger i Main.cs

private void Form1_Load(object sender, System.EventArgs e)
        {
           
            Form Main_Form = new Main_Form();

            Main_Form.MdiParent = this;
            Main_Form.Show();

        }
Avatar billede spif2001 Nybegynder
10. november 2005 - 14:36 #31
Den her Main_Form - du kalder upt

private void menuItem7_Click(object sender, System.EventArgs e)
        {
            Main_Form upt = new Main_Form();
            upt.Main_Form_Load(this, e);
                }

og den her Main_Form - du kalder Main_Form

private void Form1_Load(object sender, System.EventArgs e)
        {
         
            Form Main_Form = new Main_Form();

            Main_Form.MdiParent = this;
            Main_Form.Show();

        }

er jo ikke den samme. Du laver new i den første (upt) og kalder aldrig Show() på den.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:52 #32
Jamen den kører vel i forvejen Main_Form???

Så hvis mig hva du mener. For jeg er slet ikke med. Du får også lige 50 ekstra point, for og hjælpe nu hvor det tog så lang tid
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 14:54 #33
For jeg kan ikke kalde metoden med

Main_Form.Main_Form_Load(this, e)
Avatar billede spif2001 Nybegynder
10. november 2005 - 15:00 #34
Hvis du i denne metode:

private void menuItem7_Click(object sender, System.EventArgs e)
        {
            Main_Form upt = new Main_Form();
            upt.Main_Form_Load(this, e);
                }

vil kalde Main_Form_Load på Formen du lavede her:

private void Form1_Load(object sender, System.EventArgs e)
        {
       
            Form Main_Form = new Main_Form();

            Main_Form.MdiParent = this;
            Main_Form.Show();

        }

Er du nødt til at have en global variabel du kan kalde på.


----------- dvs---------

private Main_Form main_Form;//global

private void Form1_Load(object sender, System.EventArgs e)
        {
       
            this.main_Form = new Main_Form();

            this.main_Form.MdiParent = this;
            this.main_Form.Show();

        }

nu kan du i denne metode bruge den globale variabel:

private void menuItem7_Click(object sender, System.EventArgs e)
        {
            this.main_Form.Main_Form_Load(this, e);
                }

------

alt dette forudsætter at menuItem7_Click og Form1_Load ligger i samme klasse.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 15:07 #35
Nu virker det:) Jeg kan ikke takke dig nok. Det havde jeg aldrig fundet ud af uden hjælp, jeg opretter lige et ekstra spørgsmål. Så får du lige 50 ekstra point:) Jeg har virkelig lært noget idag. Tak:)
Avatar billede spif2001 Nybegynder
10. november 2005 - 15:12 #36
svar du bare selv på den her - 50 point er fint til mig :)
Avatar billede spif2001 Nybegynder
10. november 2005 - 15:12 #37
du kan evt. give dem til chaos der hjalp til i starten.
Avatar billede alex_sleiborg Nybegynder
10. november 2005 - 15:18 #38
Jep smid et svar chaos, så får du de 15 point
Avatar billede dr_chaos Nybegynder
10. november 2005 - 16:52 #39
gør jeg :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester