2

リピーターコントロールを使用している場合、一般的な方法でコントロールにアクセスすることはできません(私が知る限り)。したがって、C#で文字列を処理する必要があるほとんどの状況で、const文字列を使用しようとします。

そこで、const文字列を使用してクラスを作成しました。これらは、リピーター内のコントロールのID名を定義します。これにより、コードでプレーンな文字列を使用するよりも一般的な方法でコントロールにアクセスできるようになります。例:

public class FormularRepeaterFieldIDs
{
    public const string RubrikLiteral = "BuchungRubrikLiteral";
    public const string RubrikDropDownList = "BuchungRubrikList";
    public const string RubrikIdHiddenField = "BuchungRubrikIdHidden";
}

これにより、このようなアクセスが可能になります(もちろん、このためのより簡単なアクセスラッパーを作成できます)。

                Literal rubrikLiteral = (Literal)e.Item.FindControl(TimeExpressHelper.FormularRepeaterFieldIDs.RubrikLiteral);
                rubrikLiteral.Visible = false;

これで、Webformsフロントエンドコードで事前定義されたIDを使用することもできます。現時点では次のように見えます。

<asp:Literal ID="BuchungRubrikLiteral" Text='<%#Eval("strRubrik")%>' runat="server" />

このようなものを作ることは可能でしょうか?

<asp:Literal ID="<% FormularRepeaterFieldIDs.RubrikLiteral %>" Text='<%#Eval("strRubrik")%>' runat="server" />
4

2 に答える 2

1

おそらく、カスタムのExpressionBuilderを使用してこれを機能させることができます。何かのようなもの:

  <asp:Literal ID="<%$ Const:FormularRepeaterFieldIDs.BuchungRubrik" 
     Text='<%#Eval("strRubrik")%>' runat="server" />

Reflectionおよび/またはを使用しCodeSnippetExpressionて値を読み取るExpressionBuilderを使用します。

  class ConstExpressionBuilder : ExpressionBuilder {
       override bool SupportsEvaluate { get { return true; } }

       override CodeExpression GetCodeExpression(BoundPropertyEntry entry, ...) {
           return new CodeSnippetExpression(entry.Expression);
       }

       override object EvaluateExpression(BoundPropertyEntry entry, ...) {
           var splitExpression = entry.Expression.Split('.');
           var fieldName = splitExpression.Last();
           var typeName = entry.Expression.Substring(entry.Expression.Length - fieldName.Length - 1);
           var type = Type.GetType(typeName);
           return type.GetField(fieldName).GetValue(null);
       }
  }

Constプレフィックスを処理するために登録するweb.config :

  <expressionBuilders>
     <add expressionPrefix="Const" type="ConstExpressionBuilder" />
  </expressionBuilders>

または、既存のResourceExpressionBuilderを利用して、定数の代わりにリソースにすることもできます。

于 2012-06-27T08:32:22.243 に答える
0

あなたが試すことができます

<div runat="server" id="container">
<% 
   List<string> listOfIds = new List<string>{FormularRepeaterFieldIDs.RubrikLiteral};
   foreach(var i in listOfIds.Count)
   {
      var l = new label();
      l.ID = listOfIds[i];
      container.Controls.Add(l);
   }
%>
</div>
于 2012-06-22T10:52:35.077 に答える