2009-09-14 16 views
5

Aby ułatwić tworzenie niektórych formularzy, używamy zmodyfikowanego formantu Formview, który znajduje się w Kontroli użytkownika. Ten User Control jest na siatce i FormView, można wybrać pozycję w siatce i FormView jest przedstawiony w modalnym do przeglądania/edycji:Jak odsłonić ITemplate poprzez kontrolę użytkownika?

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

na stronie, sterowanie wygląda następująco:

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

Problem polega na użyciu EditItemTemplate, którego używamy. Jedynym sposobem mogę dowiedzieć się, jak go podłączyć ma mieć ITemplate w kontroli TabGrid i zastosować odniesienie w OnInit:

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

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

Problemem jest to, że ponieważ odniesienia do obiektu w kontrola użytkownika, odwołanie EditItemTemplate, które wiąże się z wpisami słownikowymi w FormView dla zmian, są niszczone, więc gdy otrzymasz słownik zmian wysłanych do źródła danych, są one puste przy każdym odświeżeniu.

Używane tutaj I2: ILDataSource to niestandardowa implementacja najbliższa ObjectDataSource. Zamiast ogólnego wywołania obiektu, wywołuje bezpośrednio na stronie (lub kontrolkę użytkownika) nazwę GetEntity() i zapisuje ją jako UpdateEntity(obj Entity). Ponieważ jest to bardzo specyficzny scenariusz, możemy wyeliminować 90% kodu w ObjectDataSource.

Co chcę być w stanie zrobić to wskazać <EditItemTemplate> w <I2C:TabGrid> bezpośrednio do <EditItemTemplate> z <I2:FormView> wewnątrz. Czy to możliwe, czy ktoś ma sugestie dotyczące innej trasy?

Uwaga: próbowałem wystawiając EditItemTemplate na FVSubForm jako właściwość proxy, ale to nie działa, ponieważ nieruchomość jest ustawiony na kontrolę użytkownika przed utworzeniem kontrola dziecko, więc FVSubForm jest null. Jeśli da się to obejść, z pewnością jestem uszy.

Odpowiedz

5

Jedną rzeczą, którą musisz zrobić, to zaznaczyć swoją ITemplate nieruchomości jako wsparcie dwukierunkowe wiązania z danymi:

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

Bez to, ASP.NET nie wygeneruje odpowiedniego kodu dla strony, która pozwala na działanie wyrażeń Bind().

Nie jestem pewien, czy to wszystko, czego potrzebujesz, ale jest to coś, co należy wypróbować.

David

+0

Dzięki za sugestię ... ale sytuacja jest taka: w sam ITemplate Użytkownika sterowania nie zostanie związany, to ten ITemplate sprawie kontroli Formview że jest on przypisany do dowolnego wiązania występuje na ... ma ustawiony odpowiedni zestaw atrybutów wiązania. Próbowałem mimo to, ale bez różnicy w wyniku końcowym (puste wartości aktualizacji wracają) –

+0

Mimo że nie było to bezpośrednim problemem, było to nieobsługiwanie wiążącego proxy, to ITemplate, z którym związana była Kontrola Użytkownika, nie obsługuje poprawnie Wiązanie dwukierunkowe ... ponieważ siatka nie jest bezpośrednio edytowalna, nigdy nie zauważyłem tego zachowania tylko Eval() we wszystkim poniżej. Dzięki David, nagroda dla ciebie! –

+0

Dzięki Nick. Szkoda, że ​​nie popełniliśmy błędu przy próbie użycia Bind() w scenariuszach, w których nic nie zrobi, ponieważ ITemplate nie jest odpowiednio oznaczony. Jeśli jesteś ciekawy, spójrz na wygenerowany kod strony z i bez flagi TwoWay.Z flagą zobaczysz całą nową metodę __ExtractValues__, która ma całą logikę, aby funkcja Bind() działała. –

Powiązane problemy