SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Entwicklung eines Abfragewebparts

Dieser Beitrag hat 17 Antworten

Ohne Rang
375 Beiträge
YoWoo erstellt 4 Sept. 2009 13:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich entwickle einen Abfragewebpart. Und werde für alle wichtige Punkte in diesem Thread ablegen, falls bei mir Probleme auftreten sollten und natürlich dazu die Lösungen.

Mein Ziel ist es, mit einer foreach Schleife durch alle Unterwebsites einer Stammwebiste durchzugehen, und aus einem bestimmten Listenfeld Einträge auszulesen.

Dazu hätte ich eine kleine Frage:

Mit der Klasse SPWebCollection -> Site.AllWebs, werden mir alle Websites einer Websitesammlung angezeigt. Ich habe keinen Befehl gefunden, wo nur die Websiten unter einer bestimmten Website angezeigt werden - wisst ihr wie man das realisiert?

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Sept. 2009 13:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Antwort auf Deine Frage: hole Dir von der SPSite das RootWeb (SPWeb) und gehe rekursiv durch die Webs-Eigenschaft. Das liefert Dir dann die Original-Websitehierarchie.

Für das, was Du damit vorhast, ist das allerdings Overkill. Schaue Dir mal die SPSiteDataQuery an. Damit kannst Du mit einer einzigen Abfrage Elemente/Dateien aus der gesamten SiteCollection holen (und dabei natürlich auch Filterkriterien angeben).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
63 Beiträge
sharxx Als Antwort am 4 Sept. 2009 13:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey Yowoo!

da würde ich dir eher raten, dass du die dazu vorgesehene Klasse SPSiteDataQuery verwendest - da wirst du dir einigen Coding-Aufwand ersparen und vor allem Performance gewinnen :)

Wenn du dir den Coding-Aufwand ganz ersparen willst -> http://www.sharxx.com/product/webparts/Pages/SharxXQueryWebPart.aspx jetzt sogar neu mit eigenem QueryBuilder im Web - http://www.sharepointusergroup.at/community/Grasel/Post.aspx?ID=48 ... damit kannst du alle Abfragen die du im SharePoint brauchst zusammenbauen und ausführen.

bei interesse einfach melden office@sharxx.com (kann dir auch gern eine Testversion zukommen lassen)

lg aus Österreich
flo

Ohne Rang
375 Beiträge
YoWoo Als Antwort am 4 Sept. 2009 14:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke euch beiden, schau ich mir an, habe es erstmal mit meiner Lösung versucht, funktioniert bisher gut.

meine Lösung:

OK, habs - habe einfach mittels Contains gefiltert, da alle Unterwebsites mit einer bestimmten Syntax beginnen (in der URL).

Elemente kann ich auch auslesen und gruppiert den Websites zuordnen bzw. ausgeben. Jetzt muss ich das nur noch in einen Webpart packen, der dann die Eregbnisliste in HTML Form ausgibt.

VAribalen kann ich sicherlich über ein ASP.NET Dropdownfeld auswhlen, welches sich die Informationen aus einer Liste holt, mal sehen ob ich das hinbekomme.

Ohne Rang
375 Beiträge
YoWoo Als Antwort am 4 Sept. 2009 14:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jetzt muss ich mal fragen, kann man mit "SPSiteDataQuery" und folgender Syntax (nur aus MSDN kopiert, muss natürlich angepasst werden) eine Ausgabe generieren?

// Set up the field bindings.
         BoundField boundField = new BoundField();
         boundField.HeaderText = "Last Name";
         boundField.DataField = "Title";
         this.grid.Columns.Add(boundField);

         boundField = new BoundField();
         boundField.HeaderText = "First Name";
         boundField.DataField = "FirstName";
         this.grid.Columns.Add(boundField);

         this.grid.AutoGenerateColumns = false;
         this.grid.DataSource = dv;
         this.grid.DataBind();

         this.grid.AllowSorting = true;
         this.grid.HeaderStyle.Font.Bold = true;

         this.grid.RenderControl(writer);

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Sept. 2009 14:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Code ist zwar typischer MSDN-Käse, aber so ähnlich kann man das machen. SPSiteDataQuery liefert ja eine DataTable und wenn man die an ein SPGridView bindet, dann sieht das auch gleich SharePoint-mäßig aus.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
375 Beiträge
YoWoo Als Antwort am 4 Sept. 2009 15:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kleines Problem, ich bin am programmieren des Webparts, jetzt fällt mir auf, dass mir bei der Eigenschaften der Projektmappe der vertikale Reiter "SharePoint Solution" fehlt, der unter Signierung stehen müsste - wisst ihr an was das liegen könnte?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Sept. 2009 15:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Auf welcher Projektvorlage beruht das Projekt? Der Reiter kommt von den VSeWSS-Projekten, aber man braucht ihn auch nicht wirklich.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
375 Beiträge
YoWoo Als Antwort am 4 Sept. 2009 15:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe die Visual Studio 2005 Extensions installiert, dann kann ich unter neues Projekt, unter C# und weiter bei SharePoint  Webpart auswählen.

Als Leitfaden nutze ich das SharePoint Buch von Boddenberg, damit ich den Rahmen der Implementierung hinbekomme, den eigentlichen Code bekomme ich dann schon hin.

 

Auch kann ich nicht sagen, dass die Projektmappe erstellt werden soll.

 

OK, habe es scheinbar hinbekommen, sieht halt anders aus, ich habe einfach im Reiter debuggen meine Testserver URL angegeben.

Ohne Rang
375 Beiträge
YoWoo Als Antwort am 4 Sept. 2009 15:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es funktioniert:

Der Webpart wird bei der Auswahl angezeigt, er kann jedoch nicht hinzugefügt werden, weil:

Die ausgewählten Webparts können nicht hinzugefügt werden. Assemblys, die ASP.NET-Webparts implementieren und in einem teilweise vertrauenswürdigen Speicherort installiert sind, z. B. im Verzeichnis 'bin', müssen mit dem AllowPartiallyTrustedCallersAttribute-Satz kompiliert werden, damit der Importvorgang erfolgreich ausgeführt werden kann.

Im Code habe ich dazu [assembly: AllowPartiallyTrustedCallers] hinzugefügt. Visual Studio meckert jedoch rum:

Fehler 1 Der Typ- oder Namespacename "AllowPartiallyTrustedCallers" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) C:\Dokumente und Einstellungen\Administrator\Desktop\Webparts\Software-Produkte\Software-Produkte\WebPart1\WebPart1.cs 13 12 Software-Produkte

Ich geh nach Hause, vielleicht hat jemand vor dem Wochenende noch einen Tipp - ansonsten allen ein schönes WE.

Code:

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;

//AllowPartiallyTrustedCallers
[assembly: AllowPartiallyTrustedCallers]

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Sept. 2009 16:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Füge oben ein "using System.Security" ein. Daher kommt AllowPartiallyTrustedCallers.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
375 Beiträge
YoWoo Als Antwort am 7 Sept. 2009 13:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo, bin jetzt weiter. Konnt den Webpart hinzufügen, auch spielereien mit der Anzeige von Buttons, Texten, Dropdownlisten funktioniert. Jetzt wollte ich eine Dropdownfeld mit Werten füllen, die sich in einer Tabelle befinden. Ich hatte gelesen, dass man SPControl.GetContextSite(Context) nehmen muss, wenn man die aktuelle Site ermitteln will. Wenn ich die Felder normal auslese und die Ergebnisse in der Console ausgebe funktioniert es, jetzt wollte ich halt die Werte der Dropdownlist hinzufügen. Damit die Benutzer aus vorhanden Werten auswählen können. Meine Problem an der Stelle, wie muss ich das anstellen, dass ich auf die Liste zugreifen kann.

SPSite Site = SPControl.GetContextSite(Context);
            Microsoft.SharePoint.SPWeb web = Site.OpenWeb();
            SPList List = web.Lists["Software-Produkte"];

            dropDList1 = new DropDownList();

            foreach (SPListItem listitem in List.Items)
            {
                string auswahl = listitem.Title.ToString();
                dropDList1.Items.Add(auswahl);
            }

            dropDList1.Width = Unit.Percentage(100);
            Controls.Add(dropDList1);

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Sept. 2009 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Versuche doch mal SPContext.Current.Site bzw. SPContext.Current.Web

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
375 Beiträge
YoWoo Als Antwort am 7 Sept. 2009 15:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jupp, funktioniert :)

Teste gerade die SPSIteDataQuery, nur schlecht, dass man da entweder nach den ServerTemplate sucht bzw. nach dem Basetype - die Tabellen werden wenigstens erzeugt.

Ohne Rang
375 Beiträge
YoWoo Als Antwort am 7 Sept. 2009 16:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also ich habe jetzt mal bissel rumgetestet, ich bekomme es hin, Elemente aus Listen verschiedener Unterwebsites auszulesen, aber die Gruppierung der Eintrage nach z.B. den Websitenamen ist nicht möglich.

Jetzt muss ich schauen, dass ich die Tabelle über irgendwelche Schleifenkonstrukte erzeuge oder einfach als Bericht.

Ohne Rang
375 Beiträge
YoWoo Als Antwort am 8 Sept. 2009 11:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Funktioniert fast alles, eine kleine Frage hätte ich aber noch. Wenn ich die Felder auslese, erhalten ich folgende Rückgabewerte. Ich habe mal gehört dass es eine Möglichkeit gibt, die Felder so auszulesen, wie Sie für den Benutzer sichbar sind, also ohne die "4;#".

4;#Exchange 2003;#7;#WSS 3.0

Weiß das zufällig jemand?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Sept. 2009 11:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Felder haben je nach Typ einen bestimmten SPFieldValue. Dein Wert sieht nach einem Lookup aus und da wäre das SPFieldLookupValue. Bei Mehrfachauswahl (scheint bei Dir so) ist es eine SPFieldLookupValueCollection.

Falls Du den Wert nur zur Anzeige brauchst, dann kannst Du bei jedem Feld einfach GetFieldValueAsText bzw. GetFieldValueAsHtml verwenden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
375 Beiträge
YoWoo Als Antwort am 8 Sept. 2009 13:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank an alle - funktioniert prima der Webpart.

Die Ausgabeliste lasse ich einfach mittels HTML Tags erzeugen, sozusagen "dynamisch" eine Tabelle aufbauen.