Как правильно отформатировать отображаемые значения SPGridView?
проблема
Как известно, SharePoint сохраняет данные в базе данных в виде простого текста. Некоторые поля даже имеют связанные строки, такие как <id>;#<value>
для пользовательских полей. Проценты сохраняются как двойные (1.00000000000000 для 100%) и т. Д.
Конечно, я хочу отображать данные так, как они отображаются в списках.
Что я должен делать?
Должен ли я использовать производный SPBoundField для форматирования значений (что я на самом деле сделал, и он работает нормально, пока вы не захотите отфильтровать (вероятно, SPBoundField не будет форматировать мне значения, потому что я использую ObjectDataSource не в списке, а с отражателем я видел, если в источнике данных есть SPListItems, то форматирует правильно. не мой случай)
http://img199.imageshack.us/img199/2797/ss20090820110331.png
Или я должен перебрать все DataTable и соответственно отформатировать каждую строку?
Каковы ваши методы?
Спасибо.
5 ответов
В конце концов, я не знал ни одного другого решения для циклического перемещения по строкам DataTable и форматирования их соответствующим образом.
Если источником данных вашего SPGridView является список, попробуйте SPBoundField.
Я обычно использую ItemTemplates, которые наследуются от ITemplate. С помощью ItemTemplate я использую классы SPFieldxxxValue или некоторый пользовательский форматирующий код. Это сохраняет цикл через DataTable, и шаблоны ItemTemplates могут быть использованы повторно.
Шаблоны Item прикреплены в столбце EG
// 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);
Пример 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;
}
}
Вот как я решил эту проблему.
<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();
}
Вот несколько вариантов. Я не знаю вывод их всех (было бы хорошим сообщением в блоге), но один из них должен делать то, что вы хотите:
- SPListItem.GetFormattedValue ()
- SPField.GetFieldValue ()
- SPField.GetFieldValueAsHtml ()
- SPField.GetFieldValueAsText ()
Также может быть полезно знать, что если вы когда-нибудь захотите использовать необработанные значения, взгляните на SPField*XYZ*Value
классы. Например, форма <id>;#<value>
Ваше упоминание представлено классом SPFieldUserValue. Вы можете передать необработанный текст его конструктору и извлечь идентификатор, значение и, что наиболее полезно, пользователя очень легко.
Я бы предложил отформатировать значения, прежде чем связывать их с spgridview. Linq и анонимный тип предпочтительнее или для вызова кода позади функции в поле, которое требует форматирования при связывании.
DataField='<%# FormatUserField(Eval("UserFieldName")) %>'
или... может быть шаблонное поле?