Laden...

xml an treeview binden?

Erstellt von gelöschtem Konto vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.407 Views
Gelöschter Account
vor 15 Jahren
xml an treeview binden?

gibt es eine möglichkeit ein xml-document an ein treeview zu binden (ich kann den aufbau des dokumentes selber definieren) oder muss ich den manuellen weg gehen und das komplette xml durchiterieren und dabei nodes erstellen?

wenn es mit dem xml nciht geht, was könnte man stattdessen als datenbasis nehmen um eine hirarchische struktur persistent zu machen und trotzdem das komfortable databinding zu benutzen?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo JAck30lena,

zu 1. ich gehe davon aus, dass ein Standard-Treeview ein solches DataBinding nicht kann, aber vielleicht findest du was auf www.codeproject.com. Wenn nicht wären dir sicher viel Leute dankbar, wenn du ein TreeView, das das kann, scheiben würdest.

zu 2. XML ist da schon das Richtige.

herbivore

Gelöschter Account
vor 15 Jahren

ach ich habs befürchtet^^ aber danke trotzdem.

915 Beiträge seit 2006
vor 15 Jahren

Hallo JAck30lena,

du könntest das z.B. wie folgt lösen über ITypedList.
Hier ein Link zu einem Lösungsweg.

Wenn das ganze mit [Serializable()] verbindest könntest daraus über eine Factory was nettes erstellen, klasse wäre das als Komponente die man auf jedes Control draufzieht und somit das Databinding erweitert.

[Helper]


  [Serializable()]
  public class Serializer<T> 
  {
      static public T LoadFromString(string xmlString)....
      static public T Load(string fileName)....
      public string SaveToString()...
      public void Save(string fileName)
  }

/PS
Man könnte sogar statt den DataBinding aufgrund der ITypedList das <TreeView>.DataSource verwenden und somit die Logik rein der XML überlassen.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Gelöschter Account
vor 15 Jahren

also,

dank codeproject.com habe ich nun 2 für solche fälle interessante trees gefunden:

  1. Data Binding TreeView in C#

hoch interessant aber die source muss IList oder IListSource implementieren, was bei einem xmldocument oder allem was mit xml zu tun hat meines wissens nciht der fall ist. dennoch ein sehr nützliches control das ich mir für eventuelle spätere verwendungen vormerken werde.

  1. Loading and Saving a TreeView control to an XML file using XmlTextWriter and XmlTextReader

das deckt meine bedürfnisse ab. ich lade das teil in den treeview, der user kann editieren und anschließend überschreibe ich einfach das alte file.

@Andreas.May
das werde ich mir jetzt noch zusätzlich ansehen. danke dir.

Schlagwörter: databinding treeview xml

915 Beiträge seit 2006
vor 15 Jahren

Habe mir ein paar kleine Gedanken in der Mittagspause dazu gemacht, hier mal etwas ausführlicher ausformuliert:

Man erstellt eine Komponente die man klassisch im Designer auf ein Form zieht, alle Controls erhallten nun ein Zusätzliches Attribut Namens BindXML.

Dafür erstellt eine Klasse XMLBindSource diese wird von Component, IExtenderProvider, ISupportInitialize abgeleitet. Als private Member besitzt diese Klasse ein Dictionary<Control, IXmlSerializable>. Anhand der Liste wird beim setzen der Eigenschaft [ProvideProperty("BindXML", typeof(Control))] ein Designersupport gesetzt via [EditorAttribute(typeof(EditorXMLDocument), typeof(UITypeEditor))].

Um nun den Support für bestimmte Controls z.B. das TreeView dafür zu aktivieren liefert man über die Schnittstelle IExtenderProvider.CanExtend(object extend) ein true für z.B. TreeView zurück.

Der zweite Teil besteht nun darin ein paar Hilfsklassen zu implementierne und somit auch die IExtenderProvider.CanExtend Controls zu fixieren, um beim Beispiel TreeView zu bleiben sähe das wie folgt aus.

Zuerst erstellt man eine abstracte Basisklasse abstract class Serializer<T> welche IXmlSerializable implementiert. Diese implementation bildet für die interne Dictionary<Control, IXmlSerializable> in der Klasse XMLBindSource das grundgerüst.
In der abstrakten Basisklasse Serializer<T> werden nun die folgenden Statischen Methoden angeboten.


	static internal void Save(string fileName, T obj)
			 {
				 this.FileName = fileName;

				 try
				 {
					 XmlSerializer serializer = new XmlSerializer(typeof(T));

					 using (TextWriter writer = new StreamWriter(fileName))
					 {
						 serializer.Serialize(writer, obj);
						 writer.Flush();
					 }
				 }
				 catch (Exception ex)
				 {
					 System.Diagnostics.Debug.Fail("Fehler beim Speichern der " + fileName + ex.Message);
					 throw;
				 }
			 }
		static internal T Load(string fileName)
		{
			try
			{
				T obj = null;
				using (TextReader reader = new StreamReader(fileName))
				{
					XmlSerializer serializer = new XmlSerializer(typeof(T));
					obj = serializer.Deserialize(reader);
				}
				return obj;
			}
			catch (Exception ex)
			{
				System.Diagnostics.Debug.Fail("Fehler beim Laden der " + fileName + ex.Message);
		
			}
			return null;
		}

Ebenso werden die protected Methoden object GetValue(object component) und SetValue(object component, object value) erstellt welche dann in den Hilfsklassen der einzelnen Controls zur verfügung gestellt.

Über reflection werden dann in diesen Methoden die jeweiligen Propertys der Controls an die in der XML vorhandenen Daten gebunden.

Dann erstellt man diejeweiligen Controlhilfsklassen, beim GridView wäre das z.B. die Klasse XMLTreeView die von der abstrakten Basisklasse Serializer<XMLTreeView> ableitet. Über den den zweiten public Konstruktor der XMLTreeView liefert man dann ein XmlDocument xmlDocument als parameter rein welches später für das erstellen einer Datenquelle wichtig ist.

Anhand des Designersupports in XMLBindSource über die Eigenschaft welche das Attribut [EditorAttribute(typeof(EditorXMLDocument), typeof(UITypeEditor))] beinhaltet erstellt man nun einen XMLDocument Designer bei dem man vom gewählten Control also hier dann GridView die Eigenschaften aller Properties ausließt via PropertyGrid und diese mit einen XMLTag verknüpft - das resultat wird dann eben als XMLDocument an den Seter zurückgeliefert und somit auch das object an die Datenquelle geknüpft.

Damit hätte man dann eine Komponente die man im VS Designer einfach auf das Formular zieht und jedes Control das eben supported wird erhällt dann eine Eigenschaft für das Serialisieren als XML Dokument und könnte dann sogar von aussen "zur Laufzeit" wenn sich das XML ändert (einfach nen FileWatcher bei ISupportInitialize mit initalisieren) ändern. Sähe sicherlich ziemlich gut aus.

/PS
Wenn nichts dagegen hast würde ich das Thema gerne in der UtilitiesLib mit aufnehmen, schreibe es natürlich selbst anhand des aufgeführten Textes.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Gelöschter Account
vor 15 Jahren

natürlich habe ich ncihts dagegen, wen ich irgendwann das fertige teil zu gesicht bekomme ^^

für meine zwecke ist das einfache serialisieren der nodes ohne databinding momentan noch zweckdienlich. ich ahbe zwar auch überlegt mir ein control zu basteln das es kann aber das wäre in meinem fall wie eine artilleriekanone, die auf ein ameisenhaufen schießt.

wenn du dir die arbeit antun möchtest ... nur zu ^^

915 Beiträge seit 2006
vor 15 Jahren

Hrm, mir ist bei der zweiten Zigarette erst aufgefallen, das ich zu komplex dran gegangen bin. Eigentlich reicht eine Komponente aus und die Helper für verschiedene Controls kann man sich auch spaaren, da die wichtigen Properties aller Controls eh schon public sind (eigentlich auch logisch...) und somit braucht man nur diese durch Serializer<T> (daher keine abstrakte Basisklasse mehr) zu serialisieren indem man an Serializer<T> das Control übergibt das serialisiert werden soll. Na ja 🙂

Ansonsten hast natürlich recht, mit Kanonen auf Spatzen zu schießen ist zu viel.

/PS
Aufnehmen in die UtilitisLib werd ich es wohl erst Ende September, derzeit ist das Wetter einfach zu gut, arbeite daher zurzeit auch nicht an der UtilitiesLib weiter. Aber ich denke das Projekt rennt sicher nicht davon 🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(