2009-09-14 17 views
5

Belirli form oluşturma işlemini kolaylaştırmak için, bir Kullanıcı Denetimi içinde değiştirilmiş bir Formview denetimi kullanıyoruz. Kontrol ızgara ve FormView içindir Bu Kullanıcı, sen ızgara bir öğeyi seçebilir ve FormView görüntüleme/düzenleme için bir modal sunulmuştur:Bir ITemplate bir Kullanıcı Denetimi aracılığıyla nasıl ortaya çıkar?

<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> 

bir sayfa, kontrol şuna benzer:

<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> 

Sorun, kullandığımız EditItemTemplate'tir. Bunu kanca anlamaya tek yolu TabGrid kontrolünde ITemplate ve OnInit başvuru uygulamaktır:

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

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

bununla sorun olduğunu referans bir nesneye çünkü Kullanıcı denetimi, değişiklikler için FormView'daki sözlük girişleriyle bağlanan EditItemTemplate başvurusu yok edilir, bu nedenle veri kaynağına gönderilen değişikliklerin sözlüğünü aldığınızda, bunlar her geri gönderme işleminde boştur.

Burada kullanılan I2: ILDataSource, ObjectDataSource'a en yakın özel bir uygulamadır. Genel bir nesne çağrısı yerine, doğrudan sayfadaki bir GetEntity() (veya bu durumda kullanıcı denetimi) ve kaydetmek için bir UpdateEntity(obj Entity) çağırır. Çok özel bir senaryo olduğu için, ObjectDataSource'daki kodun% 90'ını kaldırabiliriz.

Ne yapmak isterler direkt olarak içine <I2:FormView> ait <EditItemTemplate> için <I2C:TabGrid> yılında <EditItemTemplate> işaret olduğunu. Bu mümkün mü, yoksa gidecek başka bir yol önerisi var mı?

Not: FVSubForm'da EditItemTemplate ürününü proxy özelliği olarak göstermeyi denedim, ancak bu özellik çalışmadı çünkü çocuk denetimi oluşturulmadan önce kullanıcı denetimi ayarlandı, bu nedenle FVSubForm boş. Bu etrafta çalışılabiliyorsa, kesinlikle kulaklarım. Olmadan

[TemplateContainer (typeof (FormView), System.ComponentModel.BindingDirection.TwoWay)]

: Yapmanız gereken

cevap

5

Bir şey iki yönlü veri bağlamayı destekleyen olarak ITemplate özelliğini işaretlemek Bu, ASP.NET, Bind() ifadelerinin çalışmasına izin veren sayfa için uygun kodu oluşturmaz.

İhtiyacın olan tek şey bu olmadığından emin değilim, ama denenecek bir şey.

David

+0

öneri için teşekkürler ... ama durum şu: ITemplate kendisi Kullanıcı Kontrol bağlı almaz, herhangi bir bağlayıcı üzerinde meydana o atandığı bu FormView kumanda üzerindeki ITemplate var ... ayarlanmış uygun ciltleme özelliklerine sahiptir. Yine de denedim, ancak sonuçta bir fark yok (boş güncelleme değerleri geri geliyor) –

+0

Bu doğrudan bir sorun olmasa da, yayılmayan bir bağlayıcı proxy idi, Kullanıcı Kontrolünün altında olması gereken ITemplate düzgün bir şekilde desteklenmiyordu çift ​​yönlü ciltleme ... grid doğrudan düzenlenebilir olmadığından, bu Eval() sadece altındaki her şeyde devam eden davranışları hiç fark etmemiştim. Teşekkürler David, sana ödül! –

+0

Teşekkürler Nick. Keşke, ITemplate düzgün bir şekilde işaretlenmediği için hiçbir şey yapmayacağı senaryolarda Bind() kullanmayı denemek için bir hata koşulu yapmış olsaydık. Merak ediyorsanız, TwoWay bayrağı olan ve olmayan sayfanın oluşturulmuş koduna bakın.Bayrakla, Bind() çalışmasını yapmak için tüm mantığa sahip olan tamamen yeni bir __ExtractValues__ yöntemi göreceksiniz. –

İlgili konular