Question

Problème

Comme nous le savons, SharePoint enregistre les données dans la base de données en texte brut. Certains champs ont même des chaînes concaténées comme <id>;#<value> pour les champs de l'utilisateur. Pourcentages sont enregistrés en tant que double (1,00000000000000 pour 100%) et etc.

Ofcourse, je veux afficher les données telles qu'elles sont affichées dans les listes.

Que dois-je faire?

Dois-je utiliser dérivé SPBoundField aux valeurs de format (ce qui fait, je l'ai fait et cela fonctionne très bien jusqu'à ce que vous voulez filtrer (probablement SPBoundField me formate pas les valeurs parce que j'utilise ObjectDataSource pas la liste et avec réflecteur j'ai vu s'il y a SPListItems en source de données, il formate correctement. Pas mon cas)

texte alt http://img199.imageshack.us/img199/2797/ss20090820110331 .png

Ou dois-je boucle à travers tous les DataTable et forme chaque ligne en conséquence?

Quelles sont vos techniques?

Merci.

Était-ce utile?

La solution 5

Après tout, je ne sais pas avoir une autre solution à boucle à travers les lignes DataTable et les formater en conséquence.

Si vos données de SPGridView source est la liste, essayez SPBoundField .

Autres conseils

Voici comment je l'ai résolu cette question.

<asp:TemplateField HeaderText="Campaign Members">
  <ItemTemplate> 
   <%# RemoveCharacters(Eval("CampaignMembers").ToString())%>
  </ItemTemplate> 
</asp:TemplateField> 

// Make sure declare using System.Text.RegularExpression;
protected string RemoveCharacters(object String) 
{
  string s1 = String.ToString(); 
  string newString = Regex.Replace(s1, @"#[\d-];", string.Empty); 
  newString = Regex.Replace(newString, "#", " "); 
  return newString.ToString();
}

J'utilise normaly ItemTemplates héritant de ITemplate. Avec dans le ItemTemplate j'utilise les classes SPFieldxxxValue ou un code formating personnalisé. Cela permet de gagner en boucle à travers le DataTable et les ItemTemplates peuvent être réutilisés.

Les ItemTemplates sont fixés dans la colonne de liaison Par exemple

// Normal Data Binding
SPBoundField fld = new SPBoundField();
fld.HeaderText = field.DisplayName;
fld.DataField = field.InternalName;
fld.SortExpression = field.InternalName;
grid.Columns.Add(fld);

// ItemTemplate Binding
TemplateField fld = new TemplateField();
fld.HeaderText = field.DisplayName;
fld.ItemTemplate = new CustomItemTemplateClass(field.InternalName);
fld.SortExpression = field.InternalName;
grid.Columns.Add(fld);

Un exemple d'un ItemTemplate

public class CustomItemTemplateClass : ITemplate
{
    private string FieldName
    { get; set; }

    public CustomItemTemplateClass(string fieldName, string formatString)
    {
        FieldName = fieldName;
    }

    #region ITemplate Members

    public void InstantiateIn(Control container)
    {
        Literal lit = new Literal();
        lit.DataBinding += new EventHandler(lit_DataBinding);
        container.Controls.Add(lit);
    }
    #endregion

    void lit_DataBinding(object sender, EventArgs e)
    {
        Literal lit = (Literal)sender;
        SPGridViewRow container = (SPGridViewRow)lit.NamingContainer;
        string fieldValue = ((DataRowView)container.DataItem)[FieldName].ToString();

        //Prosses Filed value here
        SPFieldLookupValue lookupValue = new SPFieldLookupValue(fieldValue);

        //Display new value
        lit.Text = lookupValue.LookupValue;
    }
}

Voici quelques options. Je ne sais pas la sortie de chacun d'eux (serait un bon blog post), mais l'un d'eux faire ce que vous voulez:

Il peut également être utile de savoir que si jamais vous voulez utiliser des valeurs brutes ont alors un regard sur les classes de SPField*XYZ*Value. Par exemple, la forme <id>;#<value> que vous mentionnez est représenté par la SPFieldUserValue de classe. Vous pouvez passer le texte brut à son constructeur et extraire le ID , valeur , et le plus utile utilisateur très facilement.

Je suggère soit pour formater les valeurs avant de les lier à la spgridview. LINQ et un type anonyme est PRÉFÉRÉ ou d'appeler un code derrière fonction sur le terrain qui a besoin de la mise en forme lors de la liaison.

DataField='<%# FormatUserField(Eval("UserFieldName")) %>'

ou ... peut-être un champ basé sur un modèle?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top