格式化SPGridView值的正确方法是什么?

时间:2009-08-20 08:06:27

标签: sharepoint formatting spgridview

问题

众所周知,SharePoint以纯文本格式将数据保存在数据库中。某些字段甚至为用户字段连接了<id>;#<value>之类的字符串。百分比保存为双精度数(1.00000000000000表示100%)等等。

当然,我想显示列表中显示的数据。

我该怎么办?

我应该使用派生的SPBoundField来格式化值(我实际上做了它并且它可以正常工作,直到你想要过滤(可能SPBoundField不会格式化我的值因为我使用ObjectDataSource而不是列表和反射器我看到如果有SPListItems)数据源,然后它格式正确。不是我的情况)

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

或者我必须遍历所有DataTable并相应地格式化每一行吗?

你的技术是什么?

谢谢。

5 个答案:

答案 0 :(得分:2)

我正常使用从ITemplate继承的ItemTemplates。在ItemTemplate中,我使用SPFieldxxxValue类或一些自定义格式代码。这样就可以通过DataTable保存循环,并且可以重复使用ItemTemplates。

ItemTemplates附加在Column Binding中 E.G

// 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 :(得分:2)

以下是我解决这个问题的方法。

<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 :(得分:1)

以下是一些选项。我不知道所有这些的输出(将是一篇很好的博客文章),但其中一个应该做你想做的事情:

如果您想要使用原始值,那么查看SPField*XYZ*Value类也可能很方便。例如,您提到的表单<id>;#<value>由SPFieldUserValue类表示。您可以轻松传递raw text to its constructor并提取IDvalue,最有用的User

答案 3 :(得分:0)

我建议在将值绑定到spgridview之前格式化值。 Linq和匿名类型是优先的,或者在字段上调用函数后面的代码,需要在绑定时进行格式化。

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

或......也许是一个模板化的领域?

答案 4 :(得分:0)

毕竟,我确实不知道任何其他解决方案来遍历DataTable行并相应地格式化它们。

如果您的SPGridView的数据源是列表,请尝试SPBoundField