Was ist der richtige Weg SPGridView Werte werden angezeigt zu formatieren?
-
19-09-2019 - |
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.
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:
- SPListItem.GetFormattedValue ()
- SPField.GetFieldValue ()
- SPField.GetFieldValueAsHtml ()
- SPField.GetFieldValueAsText ()
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.
brauchtDataField='<%# FormatUserField(Eval("UserFieldName")) %>'
oder ... vielleicht ein Templat-Feld?