SharePointCommunity
Die deutschsprachige Community für SharePoint, Office 365 und mit Azure

SP2010 - Werte von Custom Properties in Webparts via C# setzen

bewertet von 0 Usern
Beantwortet Dieser Beitrag hat 1 Geprüfte Antwort | 6 Antworten | 1 Follower

Top-50-Beitragsschreiber
257 Beiträge
MStel erstellt in 6 Mrz 2017 12:12

Hallo,

ich habe einen selbst entwickelten Webpart auf meiner Website (testhalber auf einer blank site) hinzugefügt.
Diesem stehen neben den Standardeinstellungen wie Layout, Darstellung etc noch benutzerdefinierte Reiter mit Eigenschaften zur Verfügung.
Auf der Website kann ich diese logischerweise Problemlos setzen, wie mache ich dies aber in C#?

Ich habe zunächst meinen Webpart im Programm eingelesen

string errMsg = string.Empty;
SPFile myWebPartFile = web.GetFile("_catalogs/wp/myWebpart.webpart");
XmlTextReader read = new XmlTextReader(myWebPartFile.OpenBinaryStream());
var myWebPart = manager.ImportWebPart(read, out errMsg);

//nach den änderungen
manager.AddWebPart(myWebPart,"Main", 1);
manager.SaveChanges(myWebPart);

Mit myWebPart.Hidden = true; könnte ich zum Beispiel die Sichtbarkeit meines benutzerdefinierten Webparts auf unsichtbar setzen.
Wie setze ich aber meine eigenen Eigenschaften? Ich habe zum Beispiel einen Reiter Datenquellen unter dem man eine Lookup Spalte angeben muss, ist diese nicht gesetzt wird der Webpart nicht korrekt angezeigt. Diese wird in C# logischerweise nicht angezeigt.

Da ich diesen Webpart  allerdings auf vielen Seiten via C# Programm hinzufügen und regelmäßig updaten muss, ist eine Lösung via Website für mich leider undenkbar.

Als ich das ganze durchdebuggt habe ist mir aufgefallen, dass unter WebBrowsableObject des Webparts alle Eigenschaften stehen, diese konnte ich jedoch nicht setzen. Weder mit ["Spaltenname"] = Wert noch mit direkter Zuweisung..

Habt ihr eine Idee wie man an die Attribute kommt bzw. diese setzt?

MFG
Mstel

Beantwortet Geprüfte Antwort

Top-10-Beitragsschreiber
Männlich
18.107 Beiträge
Verified by MStel

Ich hab sowas schon ewig nicht mehr gemacht, weshalb ich Dir höchstens die grobe Richtung zeigen kann. Wobei es zwei Möglichkeiten gibt.

1. Der Webpartmanager gibt Dir ein Objekt vom Typ Webpart. Das kannst Du in Deinen eigenen Typ casten und dann ganz normal auf die Properties zugreifen.

2. Wenn Du Dein Webpart aus einer Seite exportierst und dann die exportierte Datei öffnest (es ist XML), siehst Du, daß sich Deine Properties dort nach diesem Schema finden (oder zumndest so ähnlich):
<Property Name="NameOfProperty">value</Property>
Dieses XML kann man natürlich ebenfalls manipulieren.

Viele Grüße
Andi
af @ evocom de
Blog

Alle Antworten

Top-10-Beitragsschreiber
Männlich
18.107 Beiträge
Verified by MStel

Ich hab sowas schon ewig nicht mehr gemacht, weshalb ich Dir höchstens die grobe Richtung zeigen kann. Wobei es zwei Möglichkeiten gibt.

1. Der Webpartmanager gibt Dir ein Objekt vom Typ Webpart. Das kannst Du in Deinen eigenen Typ casten und dann ganz normal auf die Properties zugreifen.

2. Wenn Du Dein Webpart aus einer Seite exportierst und dann die exportierte Datei öffnest (es ist XML), siehst Du, daß sich Deine Properties dort nach diesem Schema finden (oder zumndest so ähnlich):
<Property Name="NameOfProperty">value</Property>
Dieses XML kann man natürlich ebenfalls manipulieren.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
257 Beiträge

Hi,

ich habe mir mal die exportierte .aspx Datei vorher und nachher angesehen (so wie in Methode 2 beschrieben) und festgestellt, dass ich dort nur eine Textersetzung an der entsprechenden Stelle vornehmen müsste um dieselbe Funktionalität zu erzeugen, wie mit der Weboberfläche.

Kann ich eine .aspx Datei vom SharePointServer  als Text zur Verarbeitung in C# (Visual Studio) einlesen und von dort aus verändern und anschließend wieder abspeichern? Wenn ja, geht das direkt in einem Schritt oder muss ich diese Datei erst lokal ablegen, auschecken/löschen und anschließend hinzufügen/aktualisieren?
Wenn nicht muss ich auf Methode1 zurückschreiben.

MFG
Mstel

Top-10-Beitragsschreiber
Männlich
18.107 Beiträge

Die ganze aspx solltest Du nicht auf diese Art manipulieren. Das schafft nur Probleme. Aber das Webpart an sich kannst Du damit bearbeiten. Ich würde das tun bevor ich es in die Seite einsetze.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
257 Beiträge

Mir ist auch aufgefallen, dass das gar nicht möglich wäre.
Denn, wenn ich versuche eine .aspx Seite als Datei von einer Website abzurufen, ist das ja lediglich der HTML Output der Seite, den ich erhalte.
Dort stehen ja nicht Property-Values drin.

Bearbeiten bevor ich es in die Seite einsetze ist ja demnach nur in Variante 1 deiner Lösungsvorschläge machbar, hab ich das richtig verstanden?

Desweiteren nochmal vielen dank!
MFG
MStel

Top-10-Beitragsschreiber
Männlich
18.107 Beiträge

MStel:
wenn ich versuche eine .aspx Seite als Datei von einer Website abzurufen, ist das ja lediglich der HTML Output der Seite

Das passiert, wenn Du es mit WebClient und über die http-Adresse machst. Ansonsten kannst Du Seiten wie jedes andere Dokument in SharePoint problemlos als SPFile öffnen. Nur bei Webpartseiten bringt das nichts, weil sie beim Wieder-Speichern kaputtgehen - meistens jedenfalls.

Du setzt doch das Webpart mit diesem Code in die Seite:

SPFile myWebPartFile = web.GetFile("_catalogs/wp/myWebpart.webpart");
XmlTextReader read = new XmlTextReader(myWebPartFile.OpenBinaryStream());
var myWebPart = manager.ImportWebPart(read, out errMsg);

In Zeile 2 hast Du doch einen XmlTextReader, der genau das XML des Webparts liefert und das kann man jetzt auch manipulieren. Oder eben Du nimmst das Webpart aus Zeile 3 und castest es in Deinen Typ, damit Du das Property direkt setzen kannst.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
257 Beiträge

Andi Fandrich:

Nur bei Webpartseiten bringt das nichts, weil sie beim Wieder-Speichern kaputtgehen - meistens jedenfalls.



Ist tatsächlich nur eine listview.aspx Seite, die ich bearbeiten wollte. Ich versuche mal über SPFile dran zu kommen.

Andi Fandrich:

In Zeile 2 hast Du doch einen XmlTextReader, der genau das XML des Webparts liefert und das kann man jetzt auch manipulieren.



Ich habe mir das Reader objekt mal im Breakpoint angeschaut und festgestellt, dass ich dort wirklich überhaupt nicht an das XML des Webparts komme. Auch mit der Methode ReadInnerXml kam ich nicht dran. In der Folgezeile, wo ich das read objekt allerdings in die Webpart variable gebe, scheint alles vollständig zu sein, da dieser ja problemlos auf der Website erscheint (zwar nicht eingerichtet, aber immerhin) sobald ich addwebpart damit aufrufe.

Andi Fandrich:

Oder eben Du nimmst das Webpart aus Zeile 3 und castest es in Deinen Typ, damit Du das Property direkt setzen kannst.


Wird wohl drauf hinauslaufen, hab so etwas zwar noch nie gemacht aber da gibt's im Internet ja mit Sicherheit genug zu.

Vielen Dank dass du dich so mit meiner Problematik befasst hast, du hast mir auf jeden Fall weiter geholfen.

MFG
Mstel
Seite 1 von 1 (7 Elemente) | RSS