2016-04-23 3 views
-1

Ich habe einen einfachen Code, aber das funktioniert nicht, wie dieses Problem zu beheben, der Thread ausgeführt wird, aber Listview aktualisiert nicht, was das Problem ist, kann jemand nur erklären?Wie füge ich Einträge in listview mit thread hinzu?

public Form1() 
    { 
     InitializeComponent(); 
     listView1.View = View.Details; 
     listView1.FullRowSelect = true; 
     listView1.Columns.Add("Problems", 80); 
     listView1.Columns.Add("Data", 120); 
     listView1.Columns.Add("Registry Key", 130); 
     listView1.Columns.Add("users", 80); 
     Thread childThread = new Thread(getlist); 
     childThread.Start(); 
    } 
    public void getlist() 
    { 
     int i; 
     for (i = 0; i < 40; i++) 
     { 
      add("a", "b", "c", "d"); 
     } 

    } 
    public void add(string prob, string reg, string data, string user) 
    { 
     String[] row = { prob, reg, data, user }; 
     ListViewItem item = new ListViewItem(row); 
     ListViewItem v = listView1.Items.Add(item); 

     item.Checked = true; 

    } 
+0

Sie vergessen, den Thread zu starten. 'childThread.Start()' – dotctor

+1

Sie werden auch ein Problem haben, dessen Lösung [hier] ist (http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from- a-thread-other-than-the-rq = 1) – dotctor

+0

Was passiert, wenn Sie Code direkt auf dem UI-Thread ausführen (wie es eigentlich sein sollte) –

Antwort

1

Es gibt einige Probleme.

  1. Sie haben einen Thread erstellt, aber nicht zum Starten aufgerufen.
  2. Auch wenn Sie den Thread starten es wird nicht funktionieren arbeiten, weil Sie nicht berechtigt sind, Steuerelemente von anderen Thread als man die Steuerelemente (oft Thread genannt) aktualisiert, Code löst cross-thread Fehler.

diese beiden Probleme beheben, sollte Ihr Code aussehen

.

public Form1() 
{ 
    InitializeComponent(); 
    listView1.View = View.Details; 
    listView1.FullRowSelect = true; 
    listView1.Columns.Add("Problems", 80); 
    listView1.Columns.Add("Data", 120); 
    listView1.Columns.Add("Registry Key", 130); 
    listView1.Columns.Add("users", 80); 
    Thread childThread = new Thread(getlist); 
    childThread.Start(); 
} 
public void getlist() 
{ 
    add("a", "b", "c", "d"); 
} 
public void add(string prob, string reg, string data, string user) 
{ 
    String[] row = { prob, reg, data, user }; 

    ListViewItem item = new ListViewItem(row); 


    if (listView1.InvokeRequired) 
    { 
     listView1.Invoke(new MethodInvoker(delegate 
     { 
      listView1.Items.Add(item); 
      item.Checked = true; 

     })); 
    } 
    else 
    { 
     listView1.Items.Add(item); 
     item.Checked = true; 
    } 


} 
+0

Eigentlich lese ich einige Registry, aber wenn ich einen neuen Thread den Wert beginne kommt vithin add(); aber die listview aktualisiert nicht y das passiert ich habe deinen code auch benutzt aber das gleiche problem und habe thread.start(); – crackdac0d3

+0

Erhalten Sie einen Fehler? –

+0

nein das ist das größte Problem – crackdac0d3

Verwandte Themen