Autor Beitrag
desertstorm2788
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 05.04.12 16:39 
Hi @ all

Ich habe eine xml datei mit der ich eine listview fülle.
Soweit sogut.
Jetzt hab ich auf der xml datei einen filewatcher laufen der bearbeitungen erkennt.
Jetzt mein problem.
Ich kann die Items der Listview nicht löschen und neu eintragen.
Bei jeder art der anspracht der listview stürzt mir das prog ab wegen diesem threadcross problems und ich weis ned wie ich dieses problem lösen könnte.

Ich hatte auch schon new Thread, backgroundworker und invoke probiert aber irgendwie hats ned richtig gefunkt.

Pls help
mfg desertstorm
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 05.04.12 16:58 
Wenn du dein Listview aus den Changed Events des FileSystemWatcher aufrufst ist Invoke die richtige Idee. Wenn das bei dir nicht klappt solltest du uns den Code zeigen.

Da du scheinbar Winforms verwendest kannst du auch Alternativ das SynchronizingObject des FileSystemWatchers auf dein Form (oder gleich dein Listview) setzen.

Für diesen Beitrag haben gedankt: desertstorm2788
desertstorm2788 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 06.04.12 06:44 
Danke Ralf für deine schnelle Antwort!

mein code sieht so aus:
ausblenden volle Höhe C#-Quelltext
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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
using System;
using System.IO;
using System.Security.Permissions;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Threading;



namespace Terminarbeiten
{

  public partial class quickmsg : Form
  {


    public quickmsg()
    {
      
      InitializeComponent();
      
            

      ListViewGroup on=new ListViewGroup();
      on.Name="ON";on.Header="Online";
      listView1.Groups.Add(on);
      ListViewGroup off=new ListViewGroup();
      off.Name="off";off.Header="Offline";
      listView1.Groups.Add(off);
      
      
      lv_refresh();
      
      FileSystemWatcher fs = new FileSystemWatcher();
      fs.Path=mainfrm.exepfad;
      fs.Filter="server.xml";
      fs.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
          fs.Changed += new FileSystemEventHandler(OnChanged);
      fs.EnableRaisingEvents = true;
      
      
    }
    

    void lv_refresh()
    {  
      
      listView1.BeginUpdate();
      
      XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("server.xml");
         XmlElement elmRoot = xmlDoc.DocumentElement;
         listView1.Items.Clear();//Bein zweiten durchlauf killt er sich hier!
           int userint;
           foreach (XmlNode element in elmRoot) 
           {userint+=1;
           string lan=element.ChildNodes[0].InnerText;
           int onoff= Convert.ToInt32(element.ChildNodes[3].InnerText);
           
           ListViewItem itm = new ListViewItem();
           itm.Group= listView1.Groups[onoff];
           itm.Text=userint.ToString();
           listView1.Items.Add(itm);
           
        }
         listView1.EndUpdate();
         
    }  
    
    
    void OnChanged(object sender, FileSystemEventArgs e)
    {
      
      lv_refresh();
      
    }
    

    
}
}

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE srv[
<!ATTLIST server id ID #IMPLIED>
]>
<root>
  <server7>
    <name>User1</name>
    <port>10000</port>
    <ip>10.0.0.127</ip>
    <onoff>0</onoff>
  </server7>
  <server4>
    <name>User2</name>
    <port>10000</port>
    <ip>10.0.0.128</ip>
    <onoff>1</onoff>
  </server4>
</root>


habe Invoke, bevor ich den ersten Thread geschrieben hab, rausgenommen weil ich 8 stunden herumgesch.... habe und nix weiter ging. -.-


mfg Manfred
desertstorm2788 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 06.04.12 08:05 
Juhu

Der frühe Vogel fängt den Wurm! =)
Nochmals Danke Ralf, SynchronizingObject funktioniert super.

Habe beim FileWatcher
ausblenden C#-Quelltext
1:
fs.SynchronizingObject=this;					


und vor xmlDoc.Load
ausblenden C#-Quelltext
1:
Thread.Sleep(500);					

eingegeben.