Frage

Problem

Wie wir wissen, speichert Sharepoint-Daten in der Datenbank im Klartext. Einige Felder haben auch verkettete Strings wie <id>;#<value> für Benutzerfelder. Percents als verdoppelt gespeichert (1,00000000000000 für 100%) und etc.

Ofcourse, ich möchte Daten anzuzeigen, wie sie in Listen angezeigt werden.

Was soll ich tun?

Soll ich abgeleitet SPBoundField zu Formatwerte verwenden (was ich auch tat tatsächlich und es funktioniert gut, bis Sie filtern möchten (wahrscheinlich SPBoundField nicht formatiert mich Werte, weil ich Object verwenden nicht auflisten und mit Reflektor sah ich, wenn es SPListItems in Datenquelle, dann formatiert richtig. Nicht mein Fall)

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

oder muss ich Schleife durch die Datatable alle und formatieren Sie jede Zeile entsprechend?

Was sind Ihre Techniken?

Danke.

War es hilfreich?

Lösung 5

Immerhin hatte ich kenne keine andere Lösung zu Schleife durch Datatable Zeilen und formatiert sie entsprechend.

Wenn Sie Ihre SPGridView Datenquelle Liste ist, versuchen Sie SPBoundField .

Andere Tipps

Hier ist, wie ich dieses Problem gelöst werden.

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

I normaly verwenden ItemTemplates, die von ITemplate erben. Mit in der ItemTemplate verwende ich die SPFieldxxxValue Klassen oder einige benutzerdefinierte Formatierung Code. Dies spart durch den Datatable Looping und das ItemTemplates kann wiederverwendet werden.

Das ItemTemplates, ist in Spalt angebracht Bindung Z

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

Ein Beispiel für eine 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;
    }
}

Hier sind ein paar Optionen. Ich weiß nicht, die Ausgabe aller von ihnen (wäre eine gute Blog-Post), aber einer von ihnen sollte das tun, was Sie wollen:

Es kann auch praktisch zu wissen, dass, wenn Sie jemals Verwendung der Rohwerte machen wollen, dann an den SPField*XYZ*Value Klassen anschauen. Sie können beispielsweise die Form <id>;#<value> erwähnen wird durch die Klasse SPFieldUserValue vertreten. Sie können die Rohtext an den Konstruktor geben und extrahieren die ID , Wert und am nützlichsten User sehr leicht.

Ich würde vorschlagen, entweder, um die Werte zu formatieren, bevor sie an die SPGridView verbindlich. Linq und ein anonymer Typ ist preffered oder einen Code hinter Funktion auf dem Feld zu rufen, das die Formatierung bei der Bindung.

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

oder ... vielleicht ein Templat-Feld?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top