Le record center de moss est un site permettant de stocker des copies des fichiers présent sur d’autres sites de la ferme.
Leur envoie peut se faire par code avec la méthode « SendToOfficialFile » d’un SPFile, par le web service « officialfile.asmx » contenu dans le répertoire « _vti_bin » de votre record center ou simplement par « click » sur un fichier présent dans une liste.
Pour activer le record center voici la démarche à suivre :
Le record center est un site SharePoint disponible dans l’onglet « Entreprise » de création de site. Celui-ci peut être situé dans n’importe quelle sous collection de site où sur sa propre webApp.
Une fois le site fait, il faut paramétrer la ferme pour l’utiliser. En effet il ne peut y avoir qu’un seul record center par ferme.
Le paramétrage ce fait dans la centrale d’administration, onglet « application management », encadré « External Service Connections », liens « Records center ». Il faut ensuite renseigner l’emplacement du web service. En général : http://monrecordcenter/_vti_bin/officialfile.asmx.
Voila, c’est opérationnel.
La problématique suivante est : Où vont aller mes fichiers ? En effet on ne peut pas envoyer tous les fichiers n’importe où. Le record center dispose de règles de routage.
Le record center dispose d’une List nommée : Record Routing. Chaque item de cette liste défini les règles à appliquer pour chaque transfert de fichier. Il n’y a que cinq propriétés :
Le titre de la règle, la description, la « location » qui est en fait le nom de la document library du record center qui recevra le fichier, un alias qui correspond au nom du dossier source sur la liste contenant le fichier d’origine et enfin le paramètre « Default » qui définit la liste à utiliser par défaut pour les fichiers ne correspondant à aucune des règles.
Attention à bien configurer les contents Types des listes cibles afin de conserver les informations pendant le transfert.
A chaque transfert de fichier Moss tentera de faire coïncider les content type source avec la cible. De plus dans le dossier properties vous retrouverez sous forme de fichier XML les méta datas du fichier source.
Source : http://blog.thekid.me.uk/archive/2007/04/13/using-the-moss-records-center.aspx
http://blog.thekid.me.uk/archive/2007/04/13/records-center-routing-in-moss.aspx
Un espace où je partage mes expériences sur les technologies Microsoft (Asp.Net, MOSS, WSS, C#, VB.NET, Silverlight, WPF, WCF,...)
mercredi 30 juin 2010
jeudi 24 juin 2010
MOSS 2007 - Envoyer un fichier vers le record center par code
Envoyer un fichier vers le record center par le code ? En réalité très simple.
NB : si vous avez un problème avec le code suivant, sachez que vous devrez peut etre utiliser un runWithElevetedPrivilege et/ou ajouter l'utilisateur à la liste des utilisateurs autorisé sur le record center.
Exemple :
SPSite site = new SPSite(@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/);
SPWeb web = site.OpenWeb(@"NewSite2");
SPFolder folder = web.GetFolder(@"NewDocLib");
SPFileCollection files = folder.Files;
SPFile file = files[@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/document.doc];
string additionalInfo = String.Empty;
OfficialFileResult res = file.SendToOfficialFile(out additionalInfo);
Console.WriteLine(res.ToString());
source :
http://msdn.microsoft.com/en-us/library/ms432811.aspx
http://www.sharepointdev.net/sharepoint--development-programming/notfound-error-while-sending-a-document-to-records-center-programmatically-62025.shtml
NB : si vous avez un problème avec le code suivant, sachez que vous devrez peut etre utiliser un runWithElevetedPrivilege et/ou ajouter l'utilisateur à la liste des utilisateurs autorisé sur le record center.
Exemple :
SPSite site = new SPSite(@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/);
SPWeb web = site.OpenWeb(@"NewSite2");
SPFolder folder = web.GetFolder(@"NewDocLib");
SPFileCollection files = folder.Files;
SPFile file = files[@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/document.doc];
string additionalInfo = String.Empty;
OfficialFileResult res = file.SendToOfficialFile(out additionalInfo);
Console.WriteLine(res.ToString());
source :
http://msdn.microsoft.com/en-us/library/ms432811.aspx
http://www.sharepointdev.net/sharepoint--development-programming/notfound-error-while-sending-a-document-to-records-center-programmatically-62025.shtml
jeudi 17 juin 2010
MOSS 2007 - WarmUp du serveur
Vous en avez assez des serveurs SharePoint long à démarrer le matin ? Alors sachez que Microsoft propose un script de WarmUp. Celui-ci se trouve sur le DVD SharePoint beta 2 Resource. Le script ce compose en trois fichiers.
Startup.bat : Dans lequel on définit le host et l’appel au script de warmup : Warmupserver.cmd. Juste avant de démarrer le script il lance le stsadm. Il faut savoir qu’un appel un à stsadm permet de préchauffer l’interface d’administration.
Warmupserver.cmd : Provoque des appels vers les principales pages du host demandé. (Vérifie le nom du serveur, récupère les ports si besoin, la ssp, etc. etc). Le code de ce script reste lisible n’hésitez pas à le consulter.
HTTPRequest.vbs : Script exécutant une requête http avec le XMLHTTP object.
En pièce jointe une archive contenant les trois fichiers : WarmUpServer.zip
Startup.bat : Dans lequel on définit le host et l’appel au script de warmup : Warmupserver.cmd. Juste avant de démarrer le script il lance le stsadm. Il faut savoir qu’un appel un à stsadm permet de préchauffer l’interface d’administration.
Warmupserver.cmd : Provoque des appels vers les principales pages du host demandé. (Vérifie le nom du serveur, récupère les ports si besoin, la ssp, etc. etc). Le code de ce script reste lisible n’hésitez pas à le consulter.
HTTPRequest.vbs : Script exécutant une requête http avec le XMLHTTP object.
En pièce jointe une archive contenant les trois fichiers : WarmUpServer.zip
jeudi 10 juin 2010
MOSS 2007 - Ajouter un Champs à une liste et dans une des vues
Encore une fois, quelque chose de peut être simple, mais qui pose problème quand on l’a jamais fait ou qu’on a oublié comment faire.
Dans l’exemple suivant on part d’un objet « web » contenant le SPweb.
Ensutie le code est assez explicite.//Récupération de la liste
SPList Lst = web.Lists["Informations Riches"];
//Ajout du champs à la liste
string name = Lst.Fields.Add("Videos Hits", SPFieldType.Integer, false);
Lst.Update();
//Récupération de la vue
SPView v = Lst.Views[0];
//Modification de la vue
v.ViewFields.Add("Videos Hits");
//Mise à jours
v.Update();
Lst.Update();
web.Update();
Source :
Moi avec le Msdn (Surtout le Msdn)
Moi avec le Msdn (Surtout le Msdn)
jeudi 3 juin 2010
MOSS 2007 - Le bouton d'édition a disparu
Que faire quand le bouton d’édition d’une page a disparu ? En général il suffit de vérifier si la page n’est pas extraite par un autre utilisateur ou si il ne manque pas des placeholders. Quand ce n’est pas suffiant cela peut venir du fait que le placeholder de publication de contenu est absent. Pour résoudre le problème il faut inclure une web part zone caché dans le layout de la page.
Placez ce code dans un place holder et le bouton reviendra.
Placez ce code dans un place holder et le bouton reviendra.
<WebPartPages:WebPartZone runat="server" AllowPersonalization="false" Visible="False" id="HiddenToAddEdit" title="ToHiddenForEdit">
<ZoneTemplate>
</ZoneTemplate>
</WebPartPages:WebPartZone>
Source :
jeudi 27 mai 2010
MOSS 2007 – Récupération d’une valeur unique ou multiple d’un profil utilisateur
Récupérer une valeur unique ou multiple depuis un profil utilisateur ne ce fait pas de la même manière. Voici un petit code d’exemple :
if (Profile[this.UserProfilePropertyName].Count == 1)
return Profile[this.UserProfilePropertyName].Value.ToString();
else
{
StringBuilder ret = new StringBuilder("");
UserProfileValueCollection values = Profile[this.UserProfilePropertyName];
System.Collections.IEnumerator allValues = values.GetEnumerator();
while(allValues.MoveNext())
{
ret.Append(allValues.Current.ToString());
ret.Append(";");
}
return ret.ToString();
}
Source : http://www.sharepoint-tips.com/2008/01/getting-user-profile-values-that.html
if (Profile[this.UserProfilePropertyName].Count == 1)
return Profile[this.UserProfilePropertyName].Value.ToString();
else
{
StringBuilder ret = new StringBuilder("");
UserProfileValueCollection values = Profile[this.UserProfilePropertyName];
System.Collections.IEnumerator allValues = values.GetEnumerator();
while(allValues.MoveNext())
{
ret.Append(allValues.Current.ToString());
ret.Append(";");
}
return ret.ToString();
}
Source : http://www.sharepoint-tips.com/2008/01/getting-user-profile-values-that.html
samedi 22 mai 2010
SPS 2010 - Formation Sharepoint 2010
Deux liens utiles pour s'auto former sur sharepoint 2010 :
Advanced developer Training : http://msdn.microsoft.com/en-us/sharepoint/ff420377.aspx
Developper sous sharepoint 2010 - Getting Started : http://msdn.microsoft.com/fr-fr/sharepoint/ee513147.aspx
Je recommande la lecture du premier lien avant de faire le getting started. Le second lien étant purement technique, l'apport en connaissance est très amoindri si on a pas fait le premier.
Advanced developer Training : http://msdn.microsoft.com/en-us/sharepoint/ff420377.aspx
Developper sous sharepoint 2010 - Getting Started : http://msdn.microsoft.com/fr-fr/sharepoint/ee513147.aspx
Je recommande la lecture du premier lien avant de faire le getting started. Le second lien étant purement technique, l'apport en connaissance est très amoindri si on a pas fait le premier.
jeudi 20 mai 2010
MOSS 2007 – Récupérer tous les dossiers et sous-dossiers d’une liste SharePoint
Dans cet article nous allons voir comment lister tous les
dossiers et sous dossiers d’une Document Library ou d’une liste.
dossiers et sous dossiers d’une Document Library ou d’une liste.
La manière simple, en utilisant une SPQuery
et en modifiant le ViewAttributes.
et en modifiant le ViewAttributes.
Voir l’exemple suivant :
SPSite site = SPContext.Current.Site;
SPWeb web = SPContext.Current.Web;
SPWeb web = SPContext.Current.Web;
SPList list = web.Lists["Shared
Documents"];
SPQuery query = new SPQuery();
//Condition
query.Query = “<Where><Eq><FieldRef
Name=’FSObjType’/><Value
Type=’Lookup’>1</Value></Eq></Where>”;
query.Query = “<Where><Eq><FieldRef
Name=’FSObjType’/><Value
Type=’Lookup’>1</Value></Eq></Where>”;
query.ViewAttributes = “Scope=’RecursiveAll’”;
SPListItemCollection items = list.GetItems(query);
string folderDetails=“”;
//Get the name and Url for the folder
foreach (SPListItem item in items)
{
folderDetails += “Folder Name:” + item.Name + “<br/>Folder
URL:” + web.Url + “/” + item.Url + “<br/>”;
}
foreach (SPListItem item in items)
{
folderDetails += “Folder Name:” + item.Name + “<br/>Folder
URL:” + web.Url + “/” + item.Url + “<br/>”;
}
Dans la propriété Query du SPQuery il faut mettre la condition FSObjType
égal à 0. C’est le type des dossiers, les Items et Documents sont à 1.
égal à 0. C’est le type des dossiers, les Items et Documents sont à 1.
Pour le passage récursif modifier : Scope=RecusirveAll .
Source : http://ktskumar.com/blog/2009/07/10/retrieve-all-folders-from-list/
jeudi 13 mai 2010
MOSS 2007 - RunWithElevatedPrivileges dans les event handler
La méthode RunWithElevatedPrivileges est l’ami du développeur SharePoint. Elle permet de nous attribuer des droits là où l’utilisateur courant n’en dispose pas. De l’impersonification classique.
Dans les webparts tout va bien. Par contre, dans les event handler, dans certains cas, il est possible d’avoir l’erreur suivante : « […] threw an exception of type 'System.UnauthorizedAccessException’ »
En effet, il est obligatoire de créer les objets dans un SPSite car les objets créés en dehors n’auront pas le droit “Full control”, même si ils sont dans un délégué. Le plus simple est de combiner l’utilisation du mot « using » et des « properties » de l’event handler à l’intérieur de l’impersonification.
Voir l’exemple si dessous :
using (SPSite theSite = new SPSite(properties.OpenWeb().Site.ID)) {...}
Source : Dernier paragraphe de http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx
(Et oui c’est pour ça que l’erreur est fréquente…), et les commentaires du post suivant : http://www.sharepoint-tips.com/2007/03/event-handler-impersonation-continued.html
Dans les webparts tout va bien. Par contre, dans les event handler, dans certains cas, il est possible d’avoir l’erreur suivante : « […] threw an exception of type 'System.UnauthorizedAccessException’ »
En effet, il est obligatoire de créer les objets dans un SPSite car les objets créés en dehors n’auront pas le droit “Full control”, même si ils sont dans un délégué. Le plus simple est de combiner l’utilisation du mot « using » et des « properties » de l’event handler à l’intérieur de l’impersonification.
Voir l’exemple si dessous :
using (SPSite theSite = new SPSite(properties.OpenWeb().Site.ID)) {...}
Source : Dernier paragraphe de http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx
(Et oui c’est pour ça que l’erreur est fréquente…), et les commentaires du post suivant : http://www.sharepoint-tips.com/2007/03/event-handler-impersonation-continued.html
jeudi 6 mai 2010
MOSS 2007 - Accèder au SPUser depuis un SPFieldUser
Le username est stocké au format 1# ;username. Pour y accèder plus facilement voici un exemple avec une tasklist :
using (SPSite site = new SPSite(“http://mysharepointsite.com”))
{
using (SPWeb web = site.OpenWeb())
{
SPList taskList = web.Lists["SampleTaskList"];
SPListItem taskListItem = taskList.Items[0];
SPFieldUser assignedTo = (SPFieldUser) taskListItem.Fields[SPBuiltInFieldId.AssignedTo];
SPFieldUserValue user= (SPFieldUserValue)assignedTo.GetFieldValue(taskListItem[SPBuiltInFieldId.AssignedTo].ToString());
SPUser userObject = user.User;
}
}
Source : http://nehasinha.wordpress.com/2008/03/28/accessing-the-spuser-from-spfielduser/
using (SPSite site = new SPSite(“http://mysharepointsite.com”))
{
using (SPWeb web = site.OpenWeb())
{
SPList taskList = web.Lists["SampleTaskList"];
SPListItem taskListItem = taskList.Items[0];
SPFieldUser assignedTo = (SPFieldUser) taskListItem.Fields[SPBuiltInFieldId.AssignedTo];
SPFieldUserValue user= (SPFieldUserValue)assignedTo.GetFieldValue(taskListItem[SPBuiltInFieldId.AssignedTo].ToString());
SPUser userObject = user.User;
}
}
Source : http://nehasinha.wordpress.com/2008/03/28/accessing-the-spuser-from-spfielduser/
mardi 4 mai 2010
MOSS 2007 - Travailler avec une liste coté client
Un client m’a demandé un script pour comptabiliser des cliques sur des vidéos. Le tout devant être fait coté client. Les données devant être stockées dans des items d’une liste SharePoint.
La solution pour laquelle j’ai opté et l’utilisation d’un Framework JavaScript/jQuery (SPAPI) me permettant de requêter facilement les WebServices SharePoint.
Vous trouverez en annexe de l’article le Framework et un lien vers ce Framework.
L’utilisation est très simple. J’ai commencé par inclure les fichiers js contenant le code dont j’ai besoin. Ensuite à l’aide d’un tutorial sur ce Framework j’ai rédigé un petit bout de code. Je mets celui-ci à titre d’exemple. C’est une modification des exemples fournis sur le tutorial.
La référence "Videos_x0020_Hits" est le static name du champ (Field) de l’item que je veux mettre à jour. L’id estl’identifiant de l’item dans la liste.
Include des fichiers :
<script type="text/javascript" src="/Ressources/scripts/SPAPI/SPAPI_Core.js"></script>
<script type="text/javascript" src="/Ressources/scripts/SPAPI/SPAPI_Lists.js"></script>
Code source :
//Permet de compter le nombre de click sur les videos sur la home page
//Utilise le framework javascript SPAPI
//Fichier du framework requis pour ce script :
//SPAPI_Core.js
//SPAPI_Lists.js
function UpdateVideosHits(ItemId)
{
//init
var url=""+window.location;
var urlparts =
url.split('/');
url.split('/');
var lists = new SPAPI_Lists(urlparts[0] + '//' + urlparts[2]+'Liens vers la
sous collection de site voulue')
sous collection de site voulue')
//get item : récupère la derniere valeur connu pour l'item
var items = lists.getListItems('Informations
Riches','','<Query><Where><Eq><FieldRef
Name="ID" /><Value Type="Counter">'+ItemId+'</Value></Eq></Where></Query>','<ViewFields><FieldRef Name="Videos_x0020_Hits"/></ViewFields>',1,'');
Riches','','<Query><Where><Eq><FieldRef
Name="ID" /><Value Type="Counter">'+ItemId+'</Value></Eq></Where></Query>','<ViewFields><FieldRef Name="Videos_x0020_Hits"/></ViewFields>',1,'');
if (items.status == 200)
{
var rows = items.responseXML.getElementsByTagName('z:row');
var MyRes = rows[0].getAttribute("ows_Videos_x0020_Hits");
//Mise à jour de la valeur
var MyVal = 1;
if(!(MyRes == null))
{
MyVal = parseInt(MyRes);
MyVal = MyVal + 1;
}
}
else
{
//alert('There was an error while
getting item : ' + res.statusText);
getting item : ' + res.statusText);
}
//update item dans la liste
var res = lists.quickUpdateListItem('Informations
Riches', { ID: ItemId, Videos_x0020_Hits: MyVal } );
Riches', { ID: ItemId, Videos_x0020_Hits: MyVal } );
if (res.status == 200)
{
//alert('The list item was
updated.');
updated.');
}
else
{
//alert('There was an error: ' +
res.statusText);
res.statusText);
}
}
Source : http://darrenjohnstone.net/download/12/
http://darrenjohnstone.net/2008/07/22/examples-for-the-sharepoint-and-office-live-javascript-api/#topic-10
http://darrenjohnstone.net/2008/07/22/examples-for-the-sharepoint-and-office-live-javascript-api/#topic-10
Framework : SPAPI_Javascript_1_0_1.zip
vendredi 30 avril 2010
SPS 2010 - Activer l'intellisence Javascript pour vs.net 2010 et Sharepoint 2010
Pour l’activer il y a deux façons de faire.
Ajouter le script suivant à une page Aspx :
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/SP.UI.Dialog.debug.js" />
</Scripts>
</asp:ScriptManagerProxy>
<script type="text/javascript">a
.. script
</script>
Ou 3 étapes :
1 : Ajoutez un fichier javascriptà un projet « Ajax server control » (Qui référence System.Web.Extensions et la ressource embarqué MicrosoftAjax.js
2 : Ajoutez les références suivantes dans le
fichier JS :
/// <reference name="MicrosoftAjax.js"/>
/// <reference path="C:\\path-to-js\\SP.UI.Dialog.debug.js" />
/// <reference path="C:\\path-to-js\\SP.UI.Dialog.debug.js" />
3 : Ajoutez l’équivalent du « using » en
javascript en haut du fichier JS.
-
Type.registerNamespace
(
"SP.Ribbon");
etc.Utilisez Ctrl
+ Shift + J pour mettre à jour l’intellisence dans visual studio.
+ Shift + J pour mettre à jour l’intellisence dans visual studio.
Ajoutez également la version debug, la version « non debug » est compressé pour des raisons de
performances.
Source :
http://www.codeproject.com/Tips/73317/Enabling-JavaScript-intellisense-in-VS-NET-2010-to.aspx
http://www.codeproject.com/Tips/73317/Enabling-JavaScript-intellisense-in-VS-NET-2010-to.aspx
jeudi 29 avril 2010
MOSS 2007 - La collection de site de la SSP est supprimée
Que faire quand on découvre que quelqu'un (peut être vous ?) à supprimé la collection de site la SSP.
Par la centrale d'administration c'est impossible, donc il reste la solution stsadm.
stsadm.exe -o createsite -url http://<server>:<ssp_port>/ssp/admin -owneremail <email address> -ownerlogin <account> -sitetemplate OSRV#0 -title "Shared Services Administration: <your ssp name>"
L'opération peut durer longtemps.
Ensuite il faut modifier la ssp pour en tenir compte
stsadm.exe -o editssp -title "<your ssp name>" -sspadminsite http://<server>:<ssp_port>/ssp/admin
source : http://blog.glenc.net/2007/09/07/oops-i-deleted-the-ssp-admin-site-collection/
Par la centrale d'administration c'est impossible, donc il reste la solution stsadm.
stsadm.exe -o createsite -url http://<server>:<ssp_port>/ssp/admin -owneremail <email address> -ownerlogin <account> -sitetemplate OSRV#0 -title "Shared Services Administration: <your ssp name>"
L'opération peut durer longtemps.
Ensuite il faut modifier la ssp pour en tenir compte
stsadm.exe -o editssp -title "<your ssp name>" -sspadminsite http://<server>:<ssp_port>/ssp/admin
source : http://blog.glenc.net/2007/09/07/oops-i-deleted-the-ssp-admin-site-collection/
jeudi 22 avril 2010
MOSS 2007 - Suppression d'un utilisateur, de son profil et de son mySite
Exemple de suppression d'un utilisateur dont on possède le login. Avec optionnellement la suppression du MySite et du profil.
Cet exemple ne détail pas la récupération du SPweb ou du login de l'utilisateur.
using (SPSite siteCollection = ...)
{
using (SPWeb webSite = siteCollection.OpenWeb())
{
// Retrieve the ServerContext of the site collection.
ServerContext serverContext = ServerContext.GetContext(siteCollection);
// Connect to the UserProfileManager of the SharePoint Web application.
UserProfileManager userProfileManager = new UserProfileManager(serverContext);
//Remove the user old profil
if (userProfileManager.UserExists(loginName))
{
// Optionally delete the My Site of the user profile, if it exists.
UserProfile userProfile = userProfileManager.GetUserProfile(loginName);
if (userProfile.PersonalSite != null)
userProfile.PersonalSite.Delete();
// Delete the user profile.
userProfileManager.RemoveUserProfile(loginName);
}
//Delete users
webSite.SiteUsers.Remove(loginName);
}
}
Source : Perdu
Cet exemple ne détail pas la récupération du SPweb ou du login de l'utilisateur.
using (SPSite siteCollection = ...)
{
using (SPWeb webSite = siteCollection.OpenWeb())
{
// Retrieve the ServerContext of the site collection.
ServerContext serverContext = ServerContext.GetContext(siteCollection);
// Connect to the UserProfileManager of the SharePoint Web application.
UserProfileManager userProfileManager = new UserProfileManager(serverContext);
//Remove the user old profil
if (userProfileManager.UserExists(loginName))
{
// Optionally delete the My Site of the user profile, if it exists.
UserProfile userProfile = userProfileManager.GetUserProfile(loginName);
if (userProfile.PersonalSite != null)
userProfile.PersonalSite.Delete();
// Delete the user profile.
userProfileManager.RemoveUserProfile(loginName);
}
//Delete users
webSite.SiteUsers.Remove(loginName);
}
}
Source : Perdu
jeudi 15 avril 2010
MOSS 2007 - Exemple de SpQuery Sharepoint
Les SpQuery ne sont pas spécialement compliquées, un bon exemple est largement suffisant.
using (SPWeb oWebsiteRoot = SPContext.Current.Site.RootWeb)
{
SPList oList = oWebsiteRoot.Lists["Tasks"];
SPQuery oQuery = new SPQuery();
oQuery.Query = "" +
"Completed ";
SPListItemCollection collListItems = oList.GetItems(oQuery);
foreach (SPListItem oListItem in collListItems)
{
Response.Write(SPEncode.HtmlEncode(oListItem["Title"].ToString()) +
"
");
}
}
Source : Perdu
using (SPWeb oWebsiteRoot = SPContext.Current.Site.RootWeb)
{
SPList oList = oWebsiteRoot.Lists["Tasks"];
SPQuery oQuery = new SPQuery();
oQuery.Query = "
"
SPListItemCollection collListItems = oList.GetItems(oQuery);
foreach (SPListItem oListItem in collListItems)
{
Response.Write(SPEncode.HtmlEncode(oListItem["Title"].ToString()) +
"
");
}
}
Source : Perdu
mercredi 14 avril 2010
MOSS 2007 - Travailler avec les groupes et les permissions dans le modèle objet SharePoint
Nous allons voir dans cet article comment créer manuellement des groupes SharePoint
et attribuer des droits à ceux-ci.
Nous partirons depuis un événement de type feature activated dans lequel on
souhaite ajouter des groupes SharePoint avec des permissions à une liste.
Enfin, en annexe la définition des rôles SharePoint (avec leur identifiant)
disponibles afin de pouvoir facilement les retrouver en cas de besoins
{
SPSecurity.RunWithElevatedPrivileges(delegate() {
//Definition des roles
et attribuer des droits à ceux-ci.
Nous partirons depuis un événement de type feature activated dans lequel on
souhaite ajouter des groupes SharePoint avec des permissions à une liste.
Enfin, en annexe la définition des rôles SharePoint (avec leur identifiant)
disponibles afin de pouvoir facilement les retrouver en cas de besoins
public override void
FeatureActivated(SPFeatureReceiverProperties
properties)
FeatureActivated(SPFeatureReceiverProperties
properties)
{
SPWeb web = (SPWeb)properties.Feature.Parent;
try{
SPSecurity.RunWithElevatedPrivileges(delegate() {
//Ajout des groupes de sécurité
//Definition des roles
SPRoleDefinition GroupeRoleDefinition_Read = web.RoleDefinitions["Read"];
//Nom des groupes
string AdminLegalTeamGroupName = "TEST GROUPE";
//Ajout des groupes
web.SiteGroups.Add(AdminLegalTeamGroupName, web.AssociatedOwnerGroup, null, AdminLegalTeamGroupName);
//Récupération des groupes
SPGroup AdminLegalTeamGroup = web.SiteGroups[AdminLegalTeamGroupName];
//Association des groupes avec le spweb
web.AssociatedGroups.Add(AdminLegalTeamGroup);
//Assignation des rôles
SPRoleAssignment Group2RoleAssigment_AdminLegalTeam = new SPRoleAssignment(AdminLegalTeamGroup);
Group2RoleAssigment_AdminLegalTeam.RoleDefinitionBindings.Add(GroupeRoleDefinition_Read);
//Assignation au spweb
web.RoleAssignments.Add(Group2RoleAssigment_AdminLegalTeam);
//Mise à jour
web.Update();
//Ajout des sous répertoires avec les droits adaptés
SPList docLib = web.Lists["My library"];
foreach (SPFolder fold in docLib.RootFolder.SubFolders) {
if (fold.Name == "My root folder")
{
newFolder = fold.SubFolders.Add("My sub Folder ...");
newFolder.Item.BreakRoleInheritance(false);
newFolder.Item.RoleAssignments.Add(Group2RoleAssigment_AdminLegalTeam);
newFolder.Item.BreakRoleInheritance(false);
newFolder.Item.RoleAssignments.Add(Group2RoleAssigment_AdminLegalTeam);
newFolder.Item.Update();
}
}
//Mise à jour
web.Update();
}}}
Enfin le
code xml des rôles disponibles
code xml des rôles disponibles
<Roles>
<Role ID="1073741829" Name="Full
Control" Description="Has full control." Order="1"
Hidden="False" Type="Administrator" BasePermissions="FullMask"
/>
Control" Description="Has full control." Order="1"
Hidden="False" Type="Administrator" BasePermissions="FullMask"
/>
<Role ID="1073741828"
Name="Design" Description="Can view, add, update, delete,
approve, and customize." Order="2" Hidden="False"
Type="WebDesigner" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ManageLists,
ViewFormPages, Open, ViewPages, AddAndCustomizePages, ApplyThemeAndBorder,
ApplyStyleSheets, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />
Name="Design" Description="Can view, add, update, delete,
approve, and customize." Order="2" Hidden="False"
Type="WebDesigner" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ManageLists,
ViewFormPages, Open, ViewPages, AddAndCustomizePages, ApplyThemeAndBorder,
ApplyStyleSheets, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />
<Role ID="1073741925" Name="Manage
Hierarchy" Description="Can create sites and edit pages, list items,
and documents." Order="3" Hidden="False" Type="None"
BasePermissions="ViewListItems, AddListItems, EditListItems,
DeleteListItems, OpenItems, ViewVersions, DeleteVersions, CancelCheckout,
ManagePersonalViews, ManageLists, ViewFormPages, Open, ViewPages,
AddAndCustomizePages, ViewUsageData, CreateSSCSite, ManageSubwebs,
ManagePermissions, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, ManageWeb, UseClientIntegration, UseRemoteAPIs,
ManageAlerts, CreateAlerts, EditMyUserInfo, EnumeratePermissions" />
Hierarchy" Description="Can create sites and edit pages, list items,
and documents." Order="3" Hidden="False" Type="None"
BasePermissions="ViewListItems, AddListItems, EditListItems,
DeleteListItems, OpenItems, ViewVersions, DeleteVersions, CancelCheckout,
ManagePersonalViews, ManageLists, ViewFormPages, Open, ViewPages,
AddAndCustomizePages, ViewUsageData, CreateSSCSite, ManageSubwebs,
ManagePermissions, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, ManageWeb, UseClientIntegration, UseRemoteAPIs,
ManageAlerts, CreateAlerts, EditMyUserInfo, EnumeratePermissions" />
<Role ID="1073741924"
Name="Approve" Description="Can edit and approve pages, list
items, and documents." Order="4" Hidden="False"
Type="None" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo,
AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration,
UseRemoteAPIs, CreateAlerts, EditMyUserInfo" />
Name="Approve" Description="Can edit and approve pages, list
items, and documents." Order="4" Hidden="False"
Type="None" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo,
AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration,
UseRemoteAPIs, CreateAlerts, EditMyUserInfo" />
<Role ID="1073741827"
Name="Contribute" Description="Can view, add, update, and
delete." Order="5" Hidden="False"
Type="Contributor" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions,
ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite,
BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />
Name="Contribute" Description="Can view, add, update, and
delete." Order="5" Hidden="False"
Type="Contributor" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions,
ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite,
BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />
<Role ID="1073741826"
Name="Read" Description="Can view only."
Order="6" Hidden="False" Type="Reader"
BasePermissions="ViewListItems, OpenItems, ViewVersions, ViewFormPages,
Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration,
UseRemoteAPIs, CreateAlerts" />
Name="Read" Description="Can view only."
Order="6" Hidden="False" Type="Reader"
BasePermissions="ViewListItems, OpenItems, ViewVersions, ViewFormPages,
Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration,
UseRemoteAPIs, CreateAlerts" />
<Role ID="1073741926" Name="Restricted
Read" Description="Can view pages and documents, but cannot view
historical versions or review user rights information."
Order="7" Hidden="False" Type="None"
BasePermissions="ViewListItems, OpenItems, Open, ViewPages" />
Read" Description="Can view pages and documents, but cannot view
historical versions or review user rights information."
Order="7" Hidden="False" Type="None"
BasePermissions="ViewListItems, OpenItems, Open, ViewPages" />
<Role ID="1073741825" Name="Limited
Access" Description="Can view specific lists, document libraries,
list items, folders, or documents when given permissions."
Order="8" Hidden="True" Type="Guest"
BasePermissions="Open, BrowseUserInfo, UseClientIntegration" />
Access" Description="Can view specific lists, document libraries,
list items, folders, or documents when given permissions."
Order="8" Hidden="True" Type="Guest"
BasePermissions="Open, BrowseUserInfo, UseClientIntegration" />
<Role ID="1073741927" Name="View
Only" Description="Members of this group can view pages, list items,
and documents. If the document has a server-side file handler available, they
can only view the document using the server-side file handler." Order="2147483647"
Hidden="False" Type="None"
BasePermissions="ViewListItems, ViewVersions, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs,
CreateAlerts" />
Only" Description="Members of this group can view pages, list items,
and documents. If the document has a server-side file handler available, they
can only view the document using the server-side file handler." Order="2147483647"
Hidden="False" Type="None"
BasePermissions="ViewListItems, ViewVersions, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs,
CreateAlerts" />
</Roles>
Source :
mardi 13 avril 2010
MOSS 2007 - stsadm - Rappel : Deploiement de Wsp
Parceque c'est tellement simple qu'on l'oublie parfois... Parceque une faute de frappe est vite arrivé...
voici un exemple de deploiement de WSP
cd "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN"
stsadm -o addsolution -filename c:\MyPackage.wsp
stsadm -o execadmsvcjobs
stsadm -o deploysolution -name MyPackage.wsp -immediate -allcontenturls -allowGacDeployment -allowCasPolicies
stsadm -o execadmsvcjobs
source : http://msdn.microsoft.com/en-us/library/aa544500.aspx
voici un exemple de deploiement de WSP
cd "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN"
stsadm -o addsolution -filename c:\MyPackage.wsp
stsadm -o execadmsvcjobs
stsadm -o deploysolution -name MyPackage.wsp -immediate -allcontenturls -allowGacDeployment -allowCasPolicies
stsadm -o execadmsvcjobs
source : http://msdn.microsoft.com/en-us/library/aa544500.aspx
MOSS 2007 - Ajout de videos dans Sharepoint
Rien de plus simple, ajoutez une "content editor web part" et ajoutez le code suivant :
<embed allowfullscreen="true" autostart="false" height="350" loop="false" quality="high" src="{URL of video / Shared Path pointing to video file}" type="text/html; charset=UTF-8" width="350">
</embed>
Voilà le résultat
source :
http://www.sharepointkings.com/2010/01/how-to-embed-video-in-sharepoint.html
http://blogs.codes-sources.com/fabrice69/archive/2008/01/10/sharepoint-embarquer-de-la-vid-o-dans-une-page-wss-v3.aspx
<embed allowfullscreen="true" autostart="false" height="350" loop="false" quality="high" src="{URL of video / Shared Path pointing to video file}" type="text/html; charset=UTF-8" width="350">
</embed>
Voilà le résultat
source :
http://www.sharepointkings.com/2010/01/how-to-embed-video-in-sharepoint.html
http://blogs.codes-sources.com/fabrice69/archive/2008/01/10/sharepoint-embarquer-de-la-vid-o-dans-une-page-wss-v3.aspx
jeudi 1 avril 2010
Asp.net 3.5 - Rejoindre une ancre en code behind
Un petit exemple de code qui permet de rejoindre une ancre en code behind. Ne pas oublier de donner un Id à l'ancre en plus du tradionnel "name".
Page.ClientScript.RegisterStartupScript(this.GetType(), "navigate", string.Format("document.getElementById('{0}').scrollIntoView();", "MonAncreId"), true);
Asp.net 3.5 - Server Transfer et StackOverFlow
Aujourd’hui quelque chose d’un peu plus light que les derniers articles : les boucles infinies liées au Server.Transfert.
En effet, si l’on utilise Server.Transfer dans un Event de type Click(et que l'on transfère l'event click), alors on obtient une StackOverFlow. (L'event click, appel un transfert qui appel un click qui....)
Le petit code suivant permet de l’éviter.
if (IsPostBack)
{
if (Context.Items["Transferred"] == null)
{
// Initialize to prevent stackover
Context.Items["Transferred"] = new object();
// TransferToSelf
Server.Transfer("Webform1.aspx", true);
}
}
Asp.net 3.5 - Custom control dynamique, PostBack et ViewState
Un exemple est toujours mieux qu’un long discours, ci dessous une page asp.net faisant l’affichage dynamique de custom contrôle en fonction du type de données récupéré.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EditDashBoard.aspx.cs" Inherits="Admin_Dashboard_EditDashBoard" %>
<%@ Register TagPrefix="uc1" TagName="uCtrlTitle" Src="../../Include/UserControls/uCtrlTitle.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
<META HTTP-EQUIV="Expires" CONTENT="-1" />
<title>EditDashboard</title>
<link href="../../Css/standard/standard.css" type="text/css" rel="stylesheet" />
</head>
<body>
<form id="form1" runat="server">
<div style="text-align:center;margin-top:10px" align="center">
<table align="center" width="95%" border="0">
<tr>
<td align="center"><uc1:uctrltitle id="UCtrlTitle1" runat="server"></uc1:uctrltitle></td>
</tr>
</table>
</div>
<div style="text-align:center;margin-top:10px" align="center">
<asp:Panel id="Panelcontent" runat="server">
</asp:Panel>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MonProjet.Business.DashBoard;
using MonProjet.DAL.Objects;
using MonProjet.DAL.DatasContexts.DashBoard;
using MonProjetV2.Include.Controls.Dashboard;
/// <summary>
/// Page d'édition de control panel
/// </summary>
public partial class Admin_Dashboard_EditDashBoard : BasePage
{
/// <summary>
/// Liste servant a recréer des controles dynamiques
/// </summary>
List<DynamicControlForViewState> DynamicControls
{
get
{
if (ViewState["DynamicControls"] == null)
{
ViewState["DynamicControls"] = new List<DynamicControlForViewState>();
}
return (List<DynamicControlForViewState>)ViewState["DynamicControls"];
}
set
{
ViewState["DynamicControls"] = value;
}
}
/// <summary>
/// Chargement de la page, récupération de l'id du dashboard à éditer
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
Translation();
if (!Page.IsPostBack)
{
if (PreviousPage != null)
{
try
{
//Récupération de l'id du control panel
int l_DashBoardId = -1;
string l_Tmp = ((HiddenField)Page.PreviousPage.Controls[0].FindControl("Hd_DashBoardId")).Value;
if (!int.TryParse(l_Tmp, out l_DashBoardId))
{
//TODO error
Response.Write("ERROR");
}
else
{
if (l_DashBoardId > 0)
{
//TODO affichage
LoadControls(l_DashBoardId, GetLanguageId());
return;
}
else
{
//TODO error
Response.Write("ERROR");
}
}
}
catch
{
//TODO error
Response.Write("ERROR");
}
}
}
else {
ReLoadDynamicControls();
}
}
#region private
/// <summary>
/// Traduction
/// </summary>
private void Translation()
{
UCtrlTitle1.SetTitle(Translate("EDITDASHBOARD"));
}
/// <summary>
/// Rechargement des controls apres un postback par exemple
/// </summary>
private void ReLoadDynamicControls()
{
foreach (DynamicControlForViewState val in DynamicControls)
{
//Création des parties à afficher en fonction de leur type
//NB : Ne pas oublier de rattacher les Events si besoins.
switch (val.ControlType)
{
case 1: //Cokpit Main part
var CockpitPart = new DashBoardMainPart();
CockpitPart.ID = val.ControlId;
Panelcontent.Controls.Add(CockpitPart);
break;
case 2: //Detail Main part
var DetailPart = new DashBoardMainPart();
DetailPart.ID = val.ControlId;
Panelcontent.Controls.Add(DetailPart);
break;
case 3: //Titre
var TitrePart = new DashBoardtitle();
TitrePart.ID = val.ControlId;
Panelcontent.Controls.Add(TitrePart);
break;
case 4: //Section
var SectionPart = new DashBoardMainPart();
SectionPart.ID = val.ControlId;
Panelcontent.Controls.Add(SectionPart);
break;
default: //Default part
var DefaultPart = new DashBoardMainPart();
DefaultPart.ID = val.ControlId;
Panelcontent.Controls.Add(DefaultPart);
break;
}
}
}
/// <summary>
/// Charge les controles depuis une liste
/// </summary>
/// <param name="l_Res"></param>
private void LoadControlsFromList(List<DashBoardLine> l_Res)
{
List<DynamicControlForViewState> l_ControlList = new List<DynamicControlForViewState>();
foreach (DashBoardLine val in l_Res)
{
//Création des parties à afficher en fonction de leur type
switch (val.TypCtrlPanelLgn_Id)
{
case 1: //Cokpit Main part
var CockpitPart = new DashBoardMainPart();
CockpitPart.ID = string.Format("{0}{1}","CockpitPart",val.CtrPanelLgn_Id.ToString());
CockpitPart.Text = val.CtrPanelLgnTrans_Label;
CockpitPart.LigneId = val.CtrPanelLgn_Id;
CockpitPart.DashBoardId = val.CtrlPanel_Id;
Panelcontent.Controls.Add(CockpitPart);
l_ControlList.Add(new DynamicControlForViewState(1, CockpitPart.ID));
break;
case 2: //Detail Main part
var DetailPart = new DashBoardMainPart();
DetailPart.ID = string.Format("{0}{1}", "DetailPart", val.CtrPanelLgn_Id.ToString());
DetailPart.Text = val.CtrPanelLgnTrans_Label;
DetailPart.LigneId = val.CtrPanelLgn_Id;
DetailPart.DashBoardId = val.CtrlPanel_Id;
Panelcontent.Controls.Add(DetailPart);
l_ControlList.Add(new DynamicControlForViewState(2, DetailPart.ID));
break;
case 3: //Titre
var TitrePart = new DashBoardtitle();
TitrePart.ID = string.Format("{0}{1}", "TitrePart", val.CtrPanelLgn_Id.ToString());
TitrePart.Text = val.CtrPanelLgnTrans_Label;
Panelcontent.Controls.Add(TitrePart);
l_ControlList.Add(new DynamicControlForViewState(3, TitrePart.ID));
break;
case 4: //Section
var SectionPart = new DashBoardMainPart();
SectionPart.ID = string.Format("{0}{1}", "SectionPart", val.CtrPanelLgn_Id.ToString());
SectionPart.Text = val.CtrPanelLgnTrans_Label;
Panelcontent.Controls.Add(SectionPart);
l_ControlList.Add(new DynamicControlForViewState(4, SectionPart.ID));
break;
default: //Default part
var DefaultPart = new DashBoardMainPart();
DefaultPart.ID = string.Format("{0}{1}", "DefaultPart", val.CtrPanelLgn_Id.ToString());
DefaultPart.Text = val.CtrPanelLgnTrans_Label;
Panelcontent.Controls.Add(DefaultPart);
l_ControlList.Add(new DynamicControlForViewState(1, DefaultPart.ID));
break;
}
}
//Svg dans le viewstate la liste des controles de la page
//On ne sauvegarde que le type, le contenu des controles est conservé par le viewstate de ses controles enfants
DynamicControls = l_ControlList;
}
/// <summary>
/// Chargement des lignes
/// </summary>
/// <param name="DashBoardId">Id du dashboard</param>
/// <param name="LangueId">Langue devant être chargé</param>
private void LoadControls(int DashBoardId, int LangueId)
{
var L_LstLines = Dashboard.Get_DashBoardLines(DashBoardId, LangueId);
LoadControlsFromList(L_LstLines);
}
#endregion
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Objet permettant de Sauvegarder l'id et le type d'un control,
/// utilisé par exemple dans des listes de controles dynamique stockées en viewstate
/// </summary>
[Serializable]
public class DynamicControlForViewState
{
public int ControlType { get; set; }
public string ControlId { get; set; }
public DynamicControlForViewState()
{
}
public DynamicControlForViewState(int NType,String NId)
{
ControlId = NId;
ControlType = NType;
}
}
using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MonProjetV2.Include.Controls.Dashboard
{
/// <summary>
/// Control utlisé dans le dashboard pour affiché les titres de grandes parties
/// </summary>
public class DashBoardMainPart : WebControl, IPostBackEventHandler
{
/// <summary>
/// Constructeur, maintient également les controles
/// </summary>
public DashBoardMainPart()
: base()
{
//Maintient le contenu des controls
this.EnsureChildControls();
}
#region properties
/// <summary>
/// Nom utilisé à la génération des Id des controles enfants
/// </summary>
private string ControlDisplayTypeName = "DashBoardMainPartControl";
/// <summary>
/// Image button permettant d'ajouter un titre
/// </summary>
protected ImageButton AddTitleButton = new ImageButton();
/// <summary>
/// Text principal affiché dans l'encadré
/// </summary>
protected Literal MainText = new Literal();
/// <summary>
/// Conserve le contenue du MainText à travers les postback
/// </summary>
protected HiddenField HDMainTextValue = new HiddenField();
/// <summary>
/// Champs caché permettant de maintenir le numéro de ligne
/// </summary>
protected HiddenField HDLigneId = new HiddenField();
/// <summary>
/// Champs caché permettant de maintenir le numéro de dashboard
/// </summary>
protected HiddenField HDDashBoardId = new HiddenField();
/// <summary>
/// Control de test pour vérifier que le viewstate d'un contrôle est bien conservé après un postback
/// </summary>
protected TextBox TxtTest = new TextBox();
[
Description("Le texte affiché dans l'encadré principal"),
DefaultValue(""),
Localizable(true)
]
public string Text
{
get {
if (string.IsNullOrEmpty(MainText.Text))
if (!string.IsNullOrEmpty(HDMainTextValue.Value))
MainText.Text = HDMainTextValue.Value;
else
MainText.Text = string.Empty;
return this.MainText.Text;
}
set {
HDMainTextValue.Value = value;
this.MainText.Text = value;
}
}
[
Description("Identifiant de la ligne"),
DefaultValue(-1),
Localizable(true)
]
public int LigneId
{
get
{
string s = HDLigneId.Value;
if (!string.IsNullOrEmpty(s))
{
int OutResult;
if (int.TryParse(s, out OutResult))
return OutResult;
else
return 0;
}
else
return 0;
}
set
{
this.HDLigneId.Value = value.ToString();
}
}
[
Description("Identifiant du DashBoard"),
DefaultValue(-1),
Localizable(true)
]
public int DashBoardId
{
get
{
string s = HDDashBoardId.Value;
if (!string.IsNullOrEmpty(s))
{
int OutResult;
if (int.TryParse(s, out OutResult))
return OutResult;
else
return 0;
}
else
return 0;
}
set
{
this.HDDashBoardId.Value = value.ToString();
}
}
#endregion
#region Gestion des controles enfants
/// <summary>
/// Ajout des controles enfants à la collection du custom control,
/// permet de maintenir le control apres un postback(Viewstates etc.etc.)
/// </summary>
protected override void CreateChildControls()
{
//Init
AddTitleButton.ImageUrl = ResolveUrl("~/Images/icons/icon_add.gif");
//AddControls
this.Controls.Add(AddTitleButton);
this.Controls.Add(MainText);
this.Controls.Add(HDLigneId);
this.Controls.Add(HDDashBoardId);
this.Controls.Add(HDMainTextValue);
}
#endregion
#region EventsHandler
/// <summary>
/// EventHandler déclenché à l'ajout d'un titre
/// </summary>
public event EventHandler CreateTitle;
/// <summary>
/// Evenement déclenché par le click de l'ajout de titre
/// </summary>
/// <param name="Sender"></param>
/// <param name="e"></param>
protected virtual void AddTitleButton_Click(object Sender, EventArgs e)
{
//Si des méthodes sont abonnées alors on déclenche l'événement
if (CreateTitle != null)
{
CreateTitle(this, e);
}
//Traitement systematique
HttpContext.Current.Response.Write("POSTBACK ADD TITLE!!!! de "+this.ID.ToString()+" valeur post : "+TxtTest.Text );
}
// Remonté du posteBack, gestion manuel
public void RaisePostBackEvent(string eventArgument)
{
AddTitleButton_Click(this,new EventArgs());
}
/// <summary>
/// Ajout des références de postback sur les controles concernés
/// </summary>
/// <param name="writer"></param>
private void AddPostBackReference(HtmlTextWriter writer)
{
//L'ajout de return false permet d'empecher le postback de formulaire au profit de notre postback
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
Page.ClientScript.GetPostBackEventReference(this, "CreateTitle")+";return false;");
AddTitleButton.Attributes.AddAttributes(writer);
}
#endregion
/// <summary>
/// Gestion du rendu graphique du control
/// </summary>
/// <param name="writer"></param>
protected override void RenderContents(HtmlTextWriter writer)
{
//Render
if (Visible)
{
//Postback, gestion manuel des liaisons
AddPostBackReference(writer);
//Init des valeurs
MainText.Text = Text;
//Header
writer.Write(@"
<!-- Control DashBoardMainPart-->
<div style='text-align:center;margin-top:10px' align='center'>
<LINK href='" + ResolveUrl("~/Css/standard/standard.css") + @"' type='text/css' rel='stylesheet'>
");
//Bandeaux
writer.Write(@"
<TABLE id='tblzTitre' cellSpacing='0' cellPadding='0' width='95%' align='center' border='0'>
<TR>
<TD><table width='100%' class='cTblTitle'>
<tr>
<td align='center' valign='middle'>
<B>");
MainText.RenderControl(writer);
writer.Write(@"</B>
</td>
</tr>
</table>
</TD>
<TD class='cLngBorderRightS1' width='3'></TD>
</TR>
<TR>
<TD class='cLngBorderBottomS1' colSpan='2' height='3' width='100%'></TD>
</TR>
</TABLE>
");
//Rendu des controles enfants
writer.Write("<div style='text-align:right;margin-top:10px' align='right'>");
AddTitleButton.RenderControl(writer);
writer.Write("</div>");
TxtTest.RenderControl(writer);
HDMainTextValue.RenderControl(writer);
HDLigneId.RenderControl(writer);
HDDashBoardId.RenderControl(writer);
//Footer
writer.Write(@"
</div>
<!-- / Control DashBoardMainPart -->
");
}
}
}
}
Inscription à :
Articles (Atom)