1

問題

ご存知のとおり、SharePointはデータをプレーンテキストでデータベースに保存します。<id>;#<value>一部のフィールドには、ユーザーフィールドのように文字列が連結されています。パーセントは2倍(100%の場合は1.00000000000000)などとして保存されます。

もちろん、リストに表示されているとおりにデータを表示したいと思います。

私は何をすべきか?

派生したSPBoundFieldを使用して値をフォーマットする必要があります(実際に行ったもので、フィルタリングするまでは正常に機能します(おそらく、リストではなくObjectDataSourceを使用し、リフレクターを使用してデータソースにSPListItemがあるかどうかを確認したため、SPBoundFieldは値をフォーマットしません)正しくフォーマットされます。私の場合ではありません)

代替テキスト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);

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;
    }
}
于 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

ここにいくつかのオプションがあります。私はそれらすべての出力を知りません(良いブログ投稿になるでしょう)が、そのうちの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 に答える