2009-09-14 12 views
5

Para facilitar la creación de cierta forma, utilizamos un control de Formview modificado que está dentro de un Control de usuario. Este usuario de control es para una rejilla y un FormView, se puede elegir un elemento de la rejilla, y una FormView se presenta en un referente para la visualización/edición:¿Cómo exponer una ITemplate a través de un Control de usuario?

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

En una página, el control es el siguiente:

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

El problema es el EditItemTemplate que usamos. La única manera en que puedo encontrar la manera de conectarlo es tener una ITemplate en el control TabGrid y aplicar la referencia en OnInit:

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

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

El problema con esto es que debido a que se hace referencia a un objeto en el control de usuario, la referencia EditItemTemplate que se relaciona con las entradas de diccionario en FormView para cambios se destruye, por lo que cuando obtiene el diccionario de cambios enviados a la fuente de datos, están vacíos en cada devolución.

El I2: ILDataSource utilizado aquí es una implementación personalizada más cercana a ObjectDataSource. En lugar de una llamada a un objeto genérico, llama directamente a GetEntity() en la página (o al control del usuario en este caso) y a UpdateEntity(obj Entity) para guardar. Dado que es un escenario muy específico, podemos eliminar el 90% del código en ObjectDataSource.

Lo que quiero ser capaz de hacer es señalar la <EditItemTemplate> en el <I2C:TabGrid> directamente a la <EditItemTemplate> del <I2:FormView> interior. ¿Es esto posible, o alguien tiene sugerencias de otra ruta para seguir?

Nota: Intenté exponer EditItemTemplate en FVSubForm como propiedad de proxy, pero esto no funcionó porque la propiedad está configurada en el control de usuario antes de crear el control secundario, por lo que FVSubForm es nulo. Si esto puede solucionarse, ciertamente soy todo oídos.

Respuesta

5

Una cosa que hay que hacer es marcar su propiedad ITemplate como el apoyo de dos vías de enlace de datos:

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

Sin esto, ASP.NET no generará el código apropiado para la página que permite que las expresiones Bind() funcionen.

No estoy seguro si eso es todo lo que necesita, pero eso es algo que debe intentar.

David

+0

Gracias por la sugerencia ... pero la situación es la siguiente: el propio ITemplate en el control de usuario no quede obligado, es el ITemplate en el control FormView que está asignado a ese enlace se produce en cualquier ... tiene los atributos de enlace adecuados establecidos. Lo intenté de todos modos, pero no hubo diferencia en el resultado final (volvieron los valores de actualización en blanco) –

+0

Aunque este no era el problema directo, era un proxy de enlace que no se propagaba, el ITemplate al que estaba vinculado el control de usuario no era compatible Encuadernación bidireccional ... ya que la cuadrícula no se puede editar directamente, nunca me di cuenta de que este comportamiento Eval() solo está ocurriendo en todo lo que está debajo. Gracias David, ¡la recompensa te señala! –

+0

Gracias Nick. Ojalá hubiéramos hecho una condición de error para tratar de usar Bind() en escenarios donde no hará nada porque ITemplate no está marcado correctamente. Si tiene curiosidad, eche un vistazo al código generado para la página con y sin el indicador TwoWay.Con la bandera, verá aparecer un nuevo método __ExtractValues__, que tiene toda la lógica para hacer que Bind() funcione. –

Cuestiones relacionadas