問題タブ [ibindabletemplate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - カスタム テンプレート化された asp.net コントロールの双方向データ バインディング
この質問はもともと、双方向バインディングをまったく機能させることに関するものでしたが、具体的な回答がなかったり、途中で進行したりするため、更新しています-編集履歴を確認できますが、これがより良いと考えました明快さ。
以下のコード リストでは、1 つのオブジェクトをテンプレート化されたコントロールに双方向でデータ バインドできます。この例を可能な限り単純な方法で拡張して、最もルートのオブジェクトの複雑な型のプロパティに対して、同様に双方向のデータバインディングが有効なテンプレート化されたコントロールをネストできるようにしたいと思います。たとえば、SampleFormData
にはプロパティがありますList<string> Items
。最もルートのテンプレート (このコード リストから) 内でこのリストにバインドできるようにしたいと思います。また、おそらく、挿入、削除、再バインド入力のコマンドを使用して、テキスト ボックスの編集可能なリストに文字列データを表示します。 -changes (バインドされたオブジェクトの List プロパティに戻ります)。また、これが複合型 (SampleFormChildData
文字列ではなく ) のリストである場合、新しい埋め込みSampleSpecificEntryForm
リピーターのように、リストの各項目にバインドして、リスト内で使用できます。作成者が選択した場合は、葉のような単純なプロパティに至るまで同様です。UI フィールドは自動生成する必要はなく、バインドに使用できます。
注: のケースList<string>
は特別です。組み込みバインディングでさえ文字列を DataItem として直接処理できないためです。リスト内の項目として直接文字列にバインドすることは必須ではありませんが、確かに価値があります。
これは a とは異なります。これはFormView
、アイテムのリストの 1 つにバインドすることを期待するように構築されておらず、viewstate またはどこにでも永続化されている単一のアイテムにのみバインドするように構築されているためです。FormView とは異なり、これには FormView の EditTemplate に似た単一のデフォルト テンプレートしかありません。同様に、コレクションのようなプロパティへのバインディングも、編集という 1 つのビューのみを持ちます。行の選択と編集はありません。すべてがいつでも編集可能です。目的は、双方向のバインドされたフォームを簡単に作成できるようにすることです。
私には、2 種類のバインディングが必要なように思えます。 SingleEntityBinding
とCollectionBinding
。 以下のコード例のようにSingleEntityBinding
、単一のオブジェクト インスタンスをデータソースとして ( によってプロトタイプ化されたようにSampleSpecificEntryForm
)取りますが、属性を使用してそのCollectionBinding
親にバインドできます。いずれかのタイプのネストは、どちらのタイプでもサポートされる必要があります。バッキングオブジェクトのデータに対する挿入/変更/削除タイプの操作などのリスト操作は、フォーム作成者の責任です。ただし、そのようなメカニズムは実装が比較的簡単です。SingleEntityBinding
DataSourceID="EntryForm1" DataMember="Items"
DataList1
ここにいくつかのコードがあります。誰かの役に立てば幸いです。この設定された目標に対する最良の提案には 200 ポイントが与えられます...
ASP.NET ページを使用すると、次のようになります。
Default2.aspx.cs:
リストコンポーネントを次のようにネストできるようにするために、IDataSourceも実装しました( 内):
これをカスケード方式で機能させる方法についての考えは素晴らしいでしょう (たとえば、Items リスト プロパティについて)。ここでの課題の 1 つは、Bind() がデータバインドされたオブジェクト自体 (この場合は文字列) を参照できず、そのアイテムのプロパティを参照できないことです。これにより、リストへのバインドが厄介になります。
助けてくれてありがとう!
道中の発見
IDataItemContainer を実装しました。これで直るだろうと期待していましたが、違います。目立った変化なし。 おっと、間違ったクラスに実装しました。現在はバインドされていますが、値はポストバック時にバインドされたオブジェクトに再バインドされていません。うーん...
この記事が示唆するように、Page.GetDataItem() が例外のソースです。この例外は、ページの _dataBindingContext が null または空の場合にスローされます。この記事ではこれについて説明していますが、Page の _dataBindingContext が設定されていることを確認する方法については述べていません。探し続けます。
MSDN のドキュメントにあるように、DataBoundControl は DataBind() をオーバーライドするのではなく、PerformDataBinding を実装する必要があります。私はそうして、双方向バインディングの作業を行いました。このコードは必要ですか、それとも組み込みのものを使用する必要がありますか?
c# - フォーム ビューと外部 IBindableTemplate
カスタム FormView コントロールで編集/挿入および表示用の 1 つのテンプレートを設定したいと思います。しかし、私はこれらの奇妙な例外を得ました
Unable to cast object of type 'System.Web.UI.LiteralControl' to type 'System.Web.UI.WebControls.Table'.
編集:
最初のステップで、新しいユーザー コントロールを作成し、フォームビュー ("FV") を追加しました。
ここで、このユーザー コントロールを Web コントロールに変換したいと思います。
私の質問に答えていただければ幸いです。