ObjectContainerDataSource にバインドする一連のテキスト ボックスとドロップ ダウン リストを含む DetailsView を使用して Web ページを作成する必要があります。これは、InsertItemTemplate を使用した一方向バインディング用です。
静的に定義されたフィールドを使用して、テキスト ボックスとドロップダウン リストの両方でこれを簡単に機能させることができますが、私の特定の状況では、Web ページを高度に構成する必要があるため、実行時にフィールドを追加する必要があります。
テキストボックスの場合、これは BoundField クラスを介して簡単に行うことができますが、ドロップダウン リストに TemplateField を使用しようとすると、すべてがひどくうまくいきません。独自の TemplateField クラスを記述したり、CompiledBindableTemplateBuilder を使用して InsertItemTemplate を直接設定したりするなど、さまざまな方法を試しました。しかし、私が何をしても、基本的な問題は、挿入ボタンがクリックされた後、TemplateFields がオブジェクト データ ソースにバインドされないことです。これは、ポストバック時に InsertItemTemplate が null であるためだと思います (すべてのフィールドがマークアップで宣言されている場合、InsertItemTemplate は null ではないことに注意してください)。誰かが私がやろうとしていることを正確に行った場合は、返信してください.
概念実証のためにテンプレート フィールド内の単純な TextBox に戻しましたが、どちらも機能しません。下に作ったものを貼っておきます。この場合、TextBox 入力を「CustomerRef」というプロパティにバインドしようとしています。私の問題は Text プロパティの設定方法に関連している可能性があると思いますが、コード ビハインドで Text プロパティを Bind(...) に設定する他の方法を見つけることができませんでした。
これは、テンプレート化されたフィールドを挿入する方法です:
var tf = new TemplateField();
tf.InsertItemTemplate = new CompiledBindableTemplateBuilder(delegate(Control container)
{
TextBox text = new TextBox();
text.ID = "MyTextBoxId";
text.Attributes.Add("Text", "<%# Bind(\"CustomerRef\") %>");
container.Controls.Add(text);
},
delegate(Control container)
{ // I've tried throwing an exception in here but it never gets executed
OrderedDictionary dict = new OrderedDictionary();
dict["CustomerRef"] = ((TextBox)container.Controls[0]).Text;
return dict;
});
これは、フィールドを DetailsView フィールド リストに追加する方法です。
ShipmentSearchView.Fields.Add(tf);
テキストボックスにテキストを入力して挿入ボタンを押します...次に、挿入イベントのイベントハンドラーで、次のようなデータソースを取得しようとします:
var dataSource = e.Instance as MyClassName;
デバッグ環境のこの時点で、問題のフィールドに InsertItemTemplate がなくなっていることに気付きました。null であり、MyCustomerRef が設定されていません。
Page_Load() のさまざまな場所にフィールドを追加しようとしました-すべてのポストバックと最初のロードの両方で。Page_Init() および詳細ビューの Init() イベントで、しかし、私がそれを行う方法に違いはないようです。この問題についてご協力いただきありがとうございます。