4

EditItemTemplate で TextBox を Bind() したいのですが、表示する前にテキスト ボックスの元の値を関数に渡す必要があります。私の目標は、値を表示する前にフォーマットすることです。これは複雑な書式設定ルールであるため、組み込みのフォーマッターを使用できません。Eval() を使用する場合は簡単ですが、Bind() を使用する場合は別の話です。コード ビハインドでイベントを使用して実行できることはわかっていますが、aspx ページからすべて実行しようとしていました。

例:

<EditItemTemplate>
        <asp:TextBox ID="NameTextBox" Text=<%# Bind("Name") %> MaxLength="255" runat="server" />
</EditItemTemplate>

ありがとう...

4

2 に答える 2

4

マークアップからこれを行うことはできません。ASP.NET には、Bind構文を解析して特別なコードを生成する特別なコードがあります。そのため、双方向データバインディングはBind(). これについての詳細は、Eilon Lipton による記事ASP.NET データバインディングで Eval() および Bind() ステートメントを処理する方法を参照してください。

多くの読者が驚いたことに、ASP.NET にはバインド メソッドがありません。ASP.NET がファイルを解析し、(角かっこ-パーセント-ポンド形式の"<%# %>") データバインディング式を使用していることを確認すると、構文を解析するための特別なケースのコードがあり、そのためのBind特別なコードが生成されます。使用する<%# Bind("Name") %>と、実際の関数呼び出しではありません。ASP.NET は、コードを解析してBind() ステートメントを検出すると、そのステートメントを 2 つの部分に分割します。最初の部分は一方向のデータバインディング部分で、最終的には通常の Eval()呼び出しになります。2 番目の部分はリバース部分です。これは通常、"string name = TextBox1.Text" バインドされた場所から値を取得する行に沿ったコードです。

非 Bind() データバインディング ステートメントはリテラル コード ( で使用 CodeSnippetExpressions)CodeDomであるため、選択した言語の任意のコードが許可されます。ただし、ASP.NET は Bind()ステートメントを解析する必要があるため、双方向データ バインディングはBind(). たとえば、次の構文は無効です。これは、任意のコードを呼び出して同時に使用しようとするBind()ため です。<%# FormatNameHelper(Bind("Name")) %>Bind("field")Bind("field", "format string {0}")

そのため、コード ビハインドでこれを行うか、Eval代わりにメソッドを使用することを検討してください。

于 2012-04-09T21:48:37.170 に答える
2

このようなものは、探しているものにかなり近いはずです。

<asp:TextBox Id="TextBox1" runat="server" Text='<%# FormatValue(Eval("Name"), Container.DisplayItemIndex) %>' />

コード ビハインドでは次のようになります。

public object FormatValue(object value, int itemIndex)
{
    var input = GridView1.Rows[itemIndex].FindControl("TextBox1") as TextBox;
    if (input != null)
    {
        //do whatever you need with the old value
        var oldValue = input.Text.Trim();
    }

    //format the value and send it back
    return string.Format("My name is {0}", value);
}
于 2012-04-09T20:51:09.713 に答える