Autor Beitrag
hakan_38
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 17.06.10 03:16 
Hi Leute,

hab eine Frage..
Ich entwickle zurzeit ein Webpart in Sharepoint mit C#. Ich möchte eine XML-Datei mit C# auslesen und in einer Tabelle in Sharepoint darstellen. Hierbei kann die Tabelle dynamisch wachsen..d.h. wenn der Anwender neue Daten eingibt, sollten diese Daten zurück in die XML-Datei geschrieben werden. Folgendes habe ich erstellt:


ausblenden volle Höhe XML-Daten
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:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="Test.xsl"?>
<Projekt xmlns:Proc="test">
  <Prozess>
    <ID>1</ID>
    <Name>Hünkar</Name>
    <Anfang>01.06.2010</Anfang>
    <Ende>01.06.2010</Ende>
    <Dauer>12345</Dauer>
    <Puffer>1923</Puffer>
    <Vorgaenger>12</Vorgaenger>
  </Prozess>
  
  <Prozess>
    <ID>2</ID>
    <Name>Prozess2</Name>
    <Anfang>01.06.2010</Anfang>
    <Ende>01.06.2010</Ende>
    <Dauer>5</Dauer>
    <Puffer>3</Puffer>
    <Vorgaenger>1</Vorgaenger>
  </Prozess>
  <Prozess>
    <ID>3</ID>
    <Name>Prozess3</Name>
    <Anfang>01.06.2010</Anfang>
    <Ende>01.06.2010</Ende>
    <Dauer>1</Dauer>
    <Puffer>9</Puffer>
    <Vorgaenger>1</Vorgaenger>
  </Prozess>
  <Prozess>
    <ID>4</ID>
    <Name>Prozess4</Name>
    <Anfang>01.06.2010</Anfang>
    <Ende>01.06.2010</Ende>
    <Dauer>9</Dauer>
    <Puffer>1</Puffer>
    <Vorgaenger>2</Vorgaenger>
  </Prozess>
  
</Projekt>



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:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using System.Xml;
using System.Collections;
using System.Reflection;
using System.Drawing;
using System.ComponentModel.Design;
using System.Data;





namespace Prozessverwaltung2
{
    [Guid("a86f49e3-0715-4e9f-891a-6b8d8162a2f4")]
    public class Process : System.Web.UI.WebControls.WebParts.WebPart
    {
        
        public Process()
        {
            teste();
        }


        public void teste()
        {
            XmlDocument xml = new XmlDocument();
            xml.Load("C:/Users/Administrator/Desktop/Prozesse.xml");

            
            Panel tabpan = new Panel(); //Panel für die Tabelle

            //Tabelle & Eigenschaften
            Table table = new Table();
            table.Width = 100;
            table.Height = 100;
            table.BackColor = Color.LightSkyBlue;
            table.CellSpacing = -1;

            //Rows
            TableRow row1 = new TableRow();
            
            ArrayList tabcell = new ArrayList(); //Array für TableCells
            ArrayList IDxml = new ArrayList();   // Alle Werte vom Tag "ID" in der XML-Datei
            ArrayList IDtxtbox = new ArrayList(); // Alle TextBoxes für die Tabelle (TxtBox, damit der User auch was
                                                                                  // eingeben kann)
            //---------------------------------------------------------
            // SPALTE ID

            // ID´s in der XML-Datei lesen und diese in den Array Speichern
            int idzaehler = 0// Um die Anzahl der ID's zu bekommen und je nachdem TableCells zu erstellen
            foreach (XmlNode Prozess in xml.SelectNodes("/Projekt/*"))
            {
                IDxml.Add(Prozess["ID"].InnerText);  /Alle Inhalte von "ID" in "IDCML"-Array.
                idzaehler++;
            }



             //IDList durchgehen und einzeln in Label schreiben
            
            for (int i = 0; i < IDxml.Count; i++)  // je nachdem wieviele ID es gibt in der XML-Datei, werden Labels 
                                                   // erstellt und diese direkt beschriftet  
            {
                IDLabel.Add(new Label().Text = IDxml.IndexOf(i).ToString());  
                
            }

            
            

            // tablecell erstellen und Label adden
            for(int j=0;j<idzaehler;j++){
                tabcell.Add(new TableCell().Controls.Add(IDLabel.IndexOf(j))); // in dem Array "tabcell" neue 
                                                                            //TableCell-Instanzen erstellen und
                                                                            //direkt die Labels von "IDLabel"-Array
                                                                            //adden. FUNKTIONIERT NICHT??  
               
            }

            //Row1 die cells hinzufügen             
            for (int k = 0; k < tabcell.Count; k++) 
            {
                row1.Cells.Add(tabcell.IndexOf(k));          //Die TableCells möchte ich hier dem Row1 hinzufügen
                                                             // Funktioniert nicht??
            }

            //----------------------------------------------------------

            table.Controls.Add(row1);
            tabpan.Controls.Add(table);
            this.Controls.Add(tabpan);

        }
    }

}



Ist mein Vorgehen korrekt? Wie könnte ich das ganze anders gestalten?
Das Problem ist, dass mein Array zunächst dynamisch sein muss..wie gesagt, die Tabelle kann wachsen(nur die Zeilen, Spalten bleiben immer so).
Die nächste Frage ist:

Wenn der Benutzer in der Zeile 3, Spalte "Anfang" etwas ändert..dann muss ich genau dies in an die richtige Position in der XML-Datei aktualisieren können. Wie könnte ich das lösen?? Bitte um Hilfeeee..

Im Anhang wie die Tabelle aussehen soll..halt nur mit Textbox.

Vielen Dank schonmal für die Antworten..:-)

Gruß
Einloggen, um Attachments anzusehen!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 17.06.10 08:56 
Hallo,

eine umfassende Antwort kann ich nicht geben, da ich mich mit Empfehlungen zu XML nicht auskenne (nur mit den absoluten Grundlagen). Aber soviel kann ich sagen:
Zitat:
ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Konkret: Für die ID ist List<int> zu verwenden, für die TextBoxen allenfalls List<TextBox>. Aber ob Letzteres wirklich vernünftig ist, wage ich zu bezweifeln, weil eine Liste von TextBoxen schon in den Controls o.ä. enthalten ist.

Auch für die Zellen solltest du eine Alternative überlegen, denn innerhalb einer jeden Spalte wird der Typ gleich bleiben (abhängig von der XML-Struktur).

Gruß Jürgen
hakan_38 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 17.06.10 09:50 
Hallo Jürgen,

vielen Dank für deine Antwort. Stimmt, einen Typcontainer mit Generics zu erstellen wäre sinnvoll..
Aber ich brauch grundsätzlich einen Ansatz. Wie könnte ich bei so einem Problem vorgehe - ich muss die Textbox eindeutig identifizieren und ansprechen können, um zu wissen wo der User (Welche Spalte, welche Zeile) etwas geändert hat. Sonst wüsste ich ja nicht, bei welchem Prozess die XML-Datei aktualisiert wird..
Mir fällt irgendwie nichts ein..bin für jeden Tipp dankbar.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 17.06.10 10:52 
Hallo,

ich würde einen anderen Ansatz verfolgen. Ließ zuerst das Xml ein und mach daraus Objekte. Anschließend kannst du dann die Objekte in eine Tabelle packen. Wegen der Zuordnung hast du ja ein eindeutige ID. Das könnte dann ungefähr so aussehen:

Die Klasse Prozess die eine Xml Node entspricht
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
class Prozess
{
   public int ID { get; set; }
   public int Name  { get; set; }
   ...

   public Prozess(XElement node)
   {
      ID = node.Element("ID").Value;
      ...
   }
}


Die Methode zum Einlesen einer Xml:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private List<Prozess> LoadProzessList(string xml)
{
   XDocument doc = XDocument.Load(xml);
   List<Prozess> processes = new List<Prozess>();

   foreach(var process in doc.Element("Projekt").Elements("Prozess"))
   {
      processes.Add(new Process(process));
   }
}


Wie du dann die Liste an Prozesse in ein SharePoint-Tablle bekommst weiß ich nicht. Wahrscheinlich Ähnlich deinem Ansatz.
Generell könntest du aber einfach die Ändernungen auf dem Objekt machen und später alle Objekte zurück in ein Xml schreiben. Das sollte so funktionieren.

Gruß
hakan_38 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 17.06.10 11:00 
Hallo nochmal,

die Sache ist.. ich will eigentlich alle Vorteile von dem XML-Object verwenden, weiss aber nur nicht wie?
Wenn ich die einzelnen Knoten im XML-Document als Objekt in ein Array speichere, geht die Struktur (childnode-Parentnode) verloren. Deshalb muss es irgendwie einen Stylesheet(XSL?) geben, dass mir erlaubt, den XML-Object so wie er ist zu übergeben und dies als Tabelle darzustellen. ´
Zurzeit lese ich alle Knoten und speichere sie in einen Array als "Object". Aber wenn ich überlege, stellt mir die Klasse "XMLDocument" eine Liste mit den Knoten und ihren Beziehungen zu Verfügung.
Das ich muss diese Struktur behalten (mit Beziehungen) und dies für die Darstellung an ein weiteres Object übergeben(so etwas wie Stylesheet?, also für Darstellung).
Denn sonst würd ich in der Tabelle nicht wissen, wo in dem XML-Document- in welchem Knoten der Wert sich ändert.
Also..gibt es da eine Möglichkeit, mit der Klasse "XMLDocument" zu arbeiten und für die Darstellung dies an ein weiteres Object zu übergeben???
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 17.06.10 11:36 
Die Verbindung hast du durch die ID. Ich sehe kein Problem. Stylesheet hat überhaupt nichts mit Objekten zu tun - vergiss das. Das kannst du in diesem Fall nicht anwenden. Intern würde ich immer, wenn es geht, mit Objekte arbeiten. Dann bist du auch nicht anfällig, wenn sich die Xml-Struktur mal ändert.
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Do 17.06.10 12:08 
statt bzw zusätzlich zu der ID würde ich vlt noch die row und col speichern - könnte spätere bearbeitung erleichtern.
zb für komplette spalten/rows bearbeitung.
bzw hinzufügen/entfernen.
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
[...]
<cols>
 <col Number="1" Value="Head" />
 <col Number="2" Value="Date" />
 [...]
</cols>
<rows>
 <row Number="1">
  <cell ColNumber="1" ID="1" Value="blaaaaa" />
  <cell ColNumber="2" ID="2" Value="blubb!" />
  [...]
 <row Number="2">
  <cell ColNumber="1" ID="200" Value="oha!" />
  [...]
 </row>
 [...]
</rows>

so würd ich's speichern.
hakan_38 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 17.06.10 12:39 
Hallo Leute,

vielen Dank für eure Antworten.
Könnt ihr vielleicht mal konkret mit meinem Code ein Beispiel erstellen..?
Ich krieg ja warum auch immer ne Fehlermeldung..

Vllt. für einen Prozess in der XML-Datei (sprich eine Zeile in der Tabelle) ein Beispiel, wie mann die Tabelle erstellt? - Also..wie soll die XML-Datei sein, wie wird sie in Csharp weiterverarbeitet um die Tabelle zu erstellen.
Wäre echt besser und verständlicher mit einem Beispiel.

bin ein wenig durcheinander..freue mich auf eure Antworten..
Toeffi
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 3



BeitragVerfasst: Fr 18.06.10 10:58 
Also vielleicht schaust du dir mal Linq To Xml an. Das könnte dir in deinem Fall gut helfen um erstmal die Daten vernünftig rauszukriegen.