IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SharePoint .NET Discussion :

utilisation de custom fieldtype dans un document Word


Sujet :

SharePoint .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut utilisation de custom fieldtype dans un document Word
    Bonjour,

    j'ai créé un fieldcontrol pour mon site sharepoint qui représente une combobox avec des données qui proviennent d'une base :

    /***************************************************/
    BSClassControl.FieldControl.cs
    /***************************************************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
     
    using System;
    using System.Runtime.InteropServices;
     
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
     
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Collections;
    using System.Collections.Generic;
     
    namespace ClassificationControl
    {
        // TODO: Replace, as needed, "TextField" with some other class derived from Microsoft.SharePoint.WebControls.BaseFieldControl.
        [CLSCompliant(false)]
        [Guid("e3bd01c1-e222-4324-8b85-b1a27291cbb0")]
        public class BSClassControlFieldControl : TextField
        {
            private DropDownList lstBox;
            private HtmlTable table;        
     
            protected override void CreateChildControls()
            {
                base.CreateChildControls();
                if (ControlMode == SPControlMode.Display)
                    return;
     
                // get data from database
                Dictionary<int, string> lstBus = null;
                try {                
                    using (dataInfo df = new dataInfo()) {
                        lstBus = df.getBusSectorClass((SPContext.Current.RegionalSettings.InstalledLanguages[0].LCID == 1036)); 
                    }
                }
                catch { }
     
                this.table = new HtmlTable();
                //this.table.Attributes["border"] = "1";
     
                HtmlTableRow row = new HtmlTableRow();
                table.Rows.Add(row);
     
                HtmlTableCell cell = null;
     
                if (this.ControlMode == SPControlMode.Edit || this.ControlMode == SPControlMode.New) {
                    cell = new HtmlTableCell();
                    cell.Attributes["class"] = "ms-formdescription";
                    cell.InnerText = "Choose a business:";
                    row.Cells.Add(cell);
     
                    row = new HtmlTableRow();
                    cell = new HtmlTableCell();
     
                    // create the treeview BSC
                    this.lstBox = new DropDownList();
                    lstBox.Items.Add(new ListItem(this.ID, this.ID));
                    lstBox.Items.Add(new ListItem("11", "11"));
     
                    // si il a réussi de récupérer les valeurs :
                    if (lstBus != null) {
                        foreach (int iKey in lstBus.Keys) {
                            //lstBox.Items.Add(new ListItem(lstBus[iKey], iKey.ToString()));
                            lstBox.Items.Add(new ListItem(lstBus[iKey], lstBus[iKey]));
                        }
     
                        // Get the current value of the field :
                        string itemfieldvalue = (string)this.ItemFieldValue;
                        if (!string.IsNullOrEmpty(itemfieldvalue)) {
                            // search the value in the listbox                        
                            lstBox.SelectedIndex = lstBox.Items.IndexOf(lstBox.Items.FindByValue(itemfieldvalue));
                        }
     
                    }
                    else {
                        lstBox.Items.Add("No Value");
                    }
     
                    // ajout du treeview
                    cell.Controls.Add(this.lstBox);
                    row.Cells.Add(cell);
                    table.Rows.Add(row);
                }
     
                lstBus = null;
                base.Controls.Add(this.table);
            }
     
            public override void UpdateFieldValueInItem()
            {
                this.EnsureChildControls();
                try {
                    this.Value = this.lstBox.Items[this.lstBox.SelectedIndex].Text;
                    this.ItemFieldValue = this.Value;
                }
                catch { ; }
            }
     
            protected override void Render(HtmlTextWriter output)
            {
                this.table.RenderControl(output);
            }
        }
     
     
        public class dataInfo : IDisposable
        {
            #region properties
            private string _connectionString;
            public string ConnectionString
            {
                get { return _connectionString; }
                set { _connectionString = value; }
            }
            #endregion
     
            public dataInfo()
            {
                IDictionary dico = Environment.GetEnvironmentVariables();
                foreach (DictionaryEntry de in dico)
                    if (de.Key.ToString() == "CnString")
                    {
                        ConnectionString = de.Value.ToString();
                        break;
                    }
                dico = null;
            }
     
            public Dictionary<int, string> getBusSectorClass(bool cultureFR)
            {
                Dictionary<int, string> lstResult = new Dictionary<int, string>();
                using (System.Data.OleDb.OleDbConnection dbCN = new System.Data.OleDb.OleDbConnection(ConnectionString))
                {
                    System.Data.OleDb.OleDbCommand dbCM = new System.Data.OleDb.OleDbCommand();
                    dbCM.Connection = dbCN;
                    dbCM.CommandType = System.Data.CommandType.StoredProcedure;
                    dbCM.CommandText = "sp_GetBusiness";
                    dbCM.Parameters.Add("@FR_culture", System.Data.OleDb.OleDbType.Boolean);
                    dbCM.Parameters["@FR_culture"].Value = cultureFR;
     
                    dbCN.Open();
                    System.Data.OleDb.OleDbDataReader reader = dbCM.ExecuteReader();
     
                    if (reader.HasRows) {
                        while (reader.Read()) {
                            lstResult.Add(Int32.Parse(reader[0].ToString()), reader[1].ToString());
                        }                    
                    }
     
                    dbCN.Close();
                }
     
                return lstResult;
            }
     
            #region IDisposable Members
     
            void IDisposable.Dispose()
            {
                //throw new Exception("The method or operation is not implemented.");
            }
     
            #endregion
        }
    }

    /***************************************************/
    fldtypes_BSClassControl.xml
    /***************************************************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0" encoding="utf-8"?>
    <FieldTypes>
      <FieldType>
        <Field Name="TypeName">BusinessControlField</Field>
        <Field Name="TypeDisplayName">BusinessControlField</Field>
        <Field Name="TypeShortDescription">BusinessControlField</Field>
        <Field Name="ParentType">Text</Field>
        <Field Name="UserCreatable">TRUE</Field>
     
        <Field Name="ShowOnListCreate">TRUE</Field>
        <Field Name="ShowOnSurveyCreate">TRUE</Field>
        <Field Name="ShowOnDocumentLibrary">TRUE</Field>
        <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
        <Field Name="Sortable">TRUE</Field>
        <Field Name="Filterable">TRUE</Field>
     
        <Field Name="FieldTypeClass">46ce9397-858d-4120-b3ab-43ff97b56929</Field>
     
      </FieldType>
    </FieldTypes>

    Mon souci c'est lorsque je l'ajoute à un librairie de document j'ai un message en rouge :
    Ce type de champ ne peut pas être modifié dans la plupart des programmes clients et risque d'empêcher l'enregistrement des documents dans la bibliothèque.

    Et ma liste est inutilisable (grisé) quand j'ouvre un document avec Word (

    Quelqu'un aurait une idée ? SVP

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 760
    Par défaut
    Salut,
    ca fait partie des petits désagrément liés aux custom fields.
    Voici quelques limites liées aux custom fields
    Citation Envoyé par stephaneey
    Bien que les custom fields sont des composants très intéressants, ils ont néanmoins leur lot de désavantages, parmi ceux-ci

    ils sont en lecture seule en mode feuille de données (datasheet)
    ils sont en lecture seule en mode intégration cliente avec les produits Office (dans word par ex, un custom field est grisé et sa valeur ne peut être modifiée)
    ils sont actifs ou non pour la ferme entière, en effet, on ne peut pas décider d'activer un custom field pour une collection particulière. On peut toutefois créer un custom field, travailler avec et le rendre invisible par la suite mais ce n'est pas idéal
    ils ne sont parfois pas pris en charge par certains produits tiers tels que des webparts etc...car ils ont un type interne Invalid

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Merci dnt91

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    J'ai une solution (un peu barbare):

    j'ai un autre "custom field control" qui affiche un rating : affichage de cinq étoile (source provenant de CodePlex). Celui là aussi était inaccessible dans le Document Information Panel dans Word !

    - J'ai créé un nouveau content type avec cette colonne à l'intérieur.
    - pour ce content type j'ai créé un nouveau DIP via Info Path
    - dans Info Path j'ai remplacer le controle grisé (rating) par une liste déroulante avec les même valeurs que mon controle (rating en mode Add/Edit)
    ---> Without value
    ---> 1
    ---> 2
    ---> 3
    ---> 4
    ---> 5

    - surtout garder la "liaison" avec le champ "rating" de notre content type
    - sauvegarder et publier
    - j'ai créé une nouvelle bibliothèque de document (Word)
    - j'ai ajouter mon content type et supprimer celui qui est par défaut

    Test :
    j'ai créé un nouveau document, l'affichage du DIP se passe sans problème je peux choisir une valeur de rating dans la liste déroulante. Après sauvegarde je vérifie dans la bibliothèque et j'ai bien le nombre d'étoile.
    Le contraire est aussi correct à savoir, je modifie depuis SP "Modifier les propriétés" en changeant la valeur depuis mon custom field control et lorsque je demande l'édition du document j'ai bien la valeur qui est sélectionné dans la liste déroulante du DIP.


    Bon, je ne sais pas si c'est une piste mais je vais continuer dans ce sens pour mon deuxième custom field control qui lui récupère ses données depuis une base SQL Server 2005 !
    (j'ai vu que l'on peut se connecter à une base SQL Server depuis Info Path...)

    Ce qui m'a aidé dans cette démarche est cette vidéo : içi

    Merci

Discussions similaires

  1. [WD-2007] Utiliser un module de classe Excel dans un document Word
    Par Sergio06 dans le forum VBA Word
    Réponses: 1
    Dernier message: 05/02/2010, 20h15
  2. [XL-2003] Macro pour utiliser des données Excel dans un document Word
    Par Jeremy0269 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2009, 19h58
  3. [VB-W]Occurence d'un style dans un document Word
    Par cocotte06 dans le forum VBA Word
    Réponses: 1
    Dernier message: 23/06/2006, 08h06
  4. Réponses: 3
    Dernier message: 06/02/2006, 18h04
  5. Réponses: 5
    Dernier message: 27/09/2005, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo