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"  />


  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.

Ajoutez également la version debug, la version « non debug » est compressé pour des raisons de
performances.







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/

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

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

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


        public override void
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.Update();                                 
       }
  }
  //Mise à jour

   web.Update();

}}}


Enfin le
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"
/>





<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" />





<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" />





<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" />




<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" />





<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" />





<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" />





<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" />





<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" />





</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

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

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 -->
            ");
            }
 
        }
    }
}