Как правильно отформатировать отображаемые значения SPGridView? - PullRequest
1 голос
/ 20 августа 2009

Задача

Как мы знаем, SharePoint сохраняет данные в базе данных в виде простого текста. В некоторых полях даже есть связанные строки, например <id>;#<value> для пользовательских полей. Проценты сохраняются как двойные (1.00000000000000 для 100%) и т. Д.

Конечно, я хочу отображать данные так, как они отображаются в списках.

Что мне делать?

Должен ли я использовать производный SPBoundField для форматирования значений (что я на самом деле сделал, и он работает нормально, пока вы не захотите отфильтровать (возможно, SPBoundField не будет форматировать мне значения, потому что я использую ObjectDataSource, а не список, и с отражателем, который я видел, если есть SPListItems источник данных, то он правильно форматирует. Не мой случай)

альтернативный текст http://img199.imageshack.us/img199/2797/ss20090820110331.png

Или я должен перебрать все DataTable и отформатировать каждую строку соответственно?

Какие у вас приемы?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 29 ноября 2010

Вот как я решил эту проблему.

<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();
}
2 голосов
/ 20 августа 2009

Обычно я использую ItemTemplates, которые наследуются от ITemplate. С помощью ItemTemplate я использую классы SPFieldxxxValue или некоторый пользовательский форматирующий код. Это сохраняет цикл через DataTable, и шаблоны ItemTemplate могут быть использованы повторно.

Шаблоны Item прикреплены в привязке столбцов * Например 1003 *

// 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;
    }
}
1 голос
/ 20 августа 2009

Вот несколько вариантов. Я не знаю вывод их всех (было бы хорошим сообщением в блоге), но один из них должен делать то, что вы хотите:

Также может быть полезно знать, что если вы когда-нибудь захотите использовать необработанные значения, взгляните на классы SPField*XYZ*Value. Например, упомянутая вами форма <id>;#<value> представлена ​​классом SPFieldUserValue. Вы можете передать необработанный текст в его конструктор и извлечь значения ID , , и наиболее полезно Пользователь очень легко.

0 голосов
/ 21 августа 2009

В конце концов, я не знал ни одного другого решения для циклического перемещения по строкам DataTable и форматирования их соответствующим образом.

Если источником данных вашего SPGridView является список, попробуйте SPBoundField .

0 голосов
/ 20 августа 2009

Я бы предложил отформатировать значения, прежде чем связывать их с spgridview. Linq и анонимный тип предпочтительнее или для вызова кода за функцией в поле, которое требует форматирования при привязке.

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

или ... может быть шаблонное поле?

...