2009-09-14 4 views
5

特定のフォームの作成を容易にするために、ユーザーコントロール内にある変更されたFormviewコントロールを使用します。このユーザーコントロールは、グリッドとFormViewコントロールのためである、あなたは、グリッド内の項目を選択することができ、およびFormViewコントロールを表示する/編集するためのモーダルで提示されています]ページでユーザコントロールからITテンプレートを公開するには?

<I2CL:Grid runat="server" ID="Grid" OnSelecting="Selecting" ShowCreate="true" /> 
<I2:Modal ID="SFModal" runat="server" UpdateMode="Conditional"> 
<ContentTemplate> 
    <I2:FormView runat="server" ID="FVSubForm" DefaultMode="Edit" DataSourceID="DSSubForm" /> 
    <I2:ILDataSource ID="DSSubForm" runat="server" /> 
</ContentTemplate> 
</I2:Modal> 

、制御は次のようになります。

<I2C:TabGrid ID="TG" runat="server" Property="ParentProperty"> 
    <Columns> 
    <I2:Column Header="Column 1" DataSource="Column1" /> 
    <I2:Column Header="Column 2" DataSource="Column2" /> 
    </Columns> 
    <EditItemTemplate> 
    <I2Form:Dropdown ID="Col1" runat="server" SelectedValue='<%# Bind("Column1") %>' List="Column1Options" /> 
    <I2Form:Textbox ID="Col2" runat="server" Text='<%# Bind("Column2") %>' /> 
    </EditItemTemplate> 
</I2C:TabGrid> 

問題は、私たちが使用するEditItemTemplateです。私はそれをフックする方法を見つけ出すことができる唯一の方法は、TabGridコントロールのITemplateを持っているとのOnInit内の参照を適用することです:

[PersistenceMode(PersistenceMode.InnerProperty), 
TemplateContainer(typeof(FormView))] 
public ITemplate EditItemTemplate { get; set; } 

protected override void OnInit(EventArgs e) 
{ 
base.OnInit(e); 
FVSubForm.EditItemTemplate = EditItemTemplate; 
} 

これで問題は、参照は、内のオブジェクトにあるため、ユーザーコントロールを使用すると、変更のためにFormViewの辞書エントリと関連するEditItemTemplate参照が破棄されるため、データソースに送信された変更の辞書を取得すると、すべてのポストバックで空になります。

ここで使用されるI2:ILDataSourceは、ObjectDataSourceに最も近いカスタム実装です。ジェネリックオブジェクト呼び出しの代わりに、ページ内のGetEntity()(この場合はユーザーコントロール)とUpdateEntity(obj Entity)を直接呼び出して保存します。非常に特殊なシナリオなので、ObjectDataSourceのコードの90%を排除できます。私が行うことができるようにしたいどのような

<I2:FormView>内部の<EditItemTemplate>に直接<I2C:TabGrid><EditItemTemplate>を指しています。これは可能ですか、誰かが別のルートを提案していますか?

注:FVSubFormのEditItemTemplateをプロキシプロパティとして公開しようとしましたが、子コントロールが作成される前にプロパティが設定されているため、FVSubFormがnullになるため、これが機能しませんでした。これがうまくいくとすれば、私は確かにすべての耳です。なければ

[TemplateContainer(typeof演算(FormViewコントロール)、System.ComponentModel.BindingDirection.TwoWay)]

:あなたがする必要がある

答えて

5

ことの一つは、双方向のデータバインディングをサポートするなど、あなたのITemplateプロパティをマークしていますこれは、ASP.NETがBind()式の動作を許可するページの適切なコードを生成しません。

私はそれがあなたが必要なのかどうかは分かりませんが、それは試してみるべきことです。

デビッド

+0

提案してくれてありがとう...しかし、状況はこれです:ITemplate自体はユーザーにコントロールがバインドされません、それは任意の結合が上に発生し、それはそれに割り当てられていることをFormViewコントロールにITemplateをです...適切なバインディング属性が設定されています。とにかく試しましたが、最終結果に差はありません(空白の更新値が戻ってきます) –

+0

これは直接の問題ではありませんでしたが、バインディングプロキシが伝播していなかったため、User ControlがバインドされたITemplateは適切にサポートされませんでした双方向のバインド...グリッドは直接編集できないので、私はこのEval()だけが下にあるすべてのもので起こっていることに気付かなかった。 Davidに感謝します。 –

+0

ありがとうニック。 ITテンプレートが正しくマークされていないため、何もしないシナリオでBind()を使用しようとするとエラー状態になってしまいました。好奇心が強い場合は、TwoWayフラグの有無にかかわらずページの生成コードを見てください。このフラグを使用すると、Bind()を動作させるためのすべてのロジックを持つまったく新しい__ExtractValues__メソッドが表示されます。 –

関連する問題