1

问题

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

当然,我想显示数据,因为它们显示在列表中。

我该怎么办?

我是否应该使用派生的 SPBoundField 来格式化值(我实际上是这样做的,并且在您想要过滤之前它工作正常(可能 SPBoundField 不会格式化我的值,因为我使用 ObjectDataSource 而不是列表并且使用反射器我看到数据源中是否有 SPListItems,然后它格式正确。不是我的情况)

替代文字 http://img199.imageshack.us/img199/2797/ss20090820110331.png

还是我必须遍历所有 DataTable 并相应地格式化每一行?

你的技术是什么?

谢谢你。

4

5 回答 5

2

我通常使用从 ITemplate 继承的 ItemTemplates。在 ItemTemplate 中,我使用 SPFieldxxxValue 类或一些自定义格式代码。这节省了循环遍历 DataTable 并且 ItemTemplates 可以重复使用。

ItemTemplates 附加在 Column Binding 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);

一个项目模板的例子

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;
    }
}
于 2009-08-20T11:38:12.723 回答
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();
}
于 2010-11-29T05:17:38.497 回答
1

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

知道如果您想使用原始值然后查看SPField*XYZ*Value类也可能很方便。例如,<id>;#<value>您提到的表单由类 SPFieldUserValue 表示。您可以将原始文本传递给它的构造函数并非常轻松地提取IDvalue和最有用的User 。

于 2009-08-20T09:15:17.193 回答
0

我建议在将它们绑定到 spgridview 之前格式化这些值。首选 Linq 和匿名类型,或者在绑定时需要格式化的字段上调用代码隐藏函数。

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

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

于 2009-08-20T09:02:18.373 回答
0

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

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

于 2009-08-21T11:22:02.617 回答