Pregunta

Soy nuevo en los controles de usuario, solo he creado uno hasta ahora, así que tengan paciencia conmigo. He estado leyendo hoy que se supone que los controles de usuario son independientes y no dependen de ninguna información del contenedor principal. Entiendo esa parte, pero lo que me cuesta entender es el & "; Correcto &"; manera de diseñar mi programa en torno a ese principio.

Estoy haciendo un formulario web en C # en el que hay una página con un control de usuario en esa página. Hice el control de usuario en su archivo ascx y lo arrastré a mi página aspx. El control de usuario es un par de cuadros de fecha y una vista de cuadrícula para mostrar los resultados de un procedimiento almacenado de SQL.

Realmente me gustaría reutilizar este control, pero no puedo entender cómo " decirle a " el usuario controla qué procedimiento almacenado me gustaría ejecutar para la página específica en la que estoy sin violar el & "; no confíe en el contenedor principal &"; regla.

Gracias

¿Fue útil?

Solución

No confíes en el contenedor principal no significa que no puedas comunicarte. Exponga una propiedad en el control de usuario que establecerá el padre. Pero tenga un valor predeterminado para que no se bloquee.

Además, si este es un control muy específico, no hay razón para que sea malo confiar en el padre. Puede que no sea lo ideal, pero estaría utilizando el control de usuario para proporcionar una separación de código.

Otros consejos

Su control no necesita saber de dónde provienen los datos. No necesita saber sobre el procedimiento almacenado ni nada más. Todo lo que necesita saber son los datos que necesita mostrar. Si entiendo bien su control, es una cuadrícula con algunos filtros de fecha. Recibirá datos, los mostrará y los filtrará por fecha. Está bien, todo lo que necesita saber son los datos que debe mostrar y, tal vez, una fecha de inicio y finalización predeterminada del padre.

Te estás perdiendo el verdadero poder de los controles del usuario si no permites que se comunique con su padre. Creo que puede estar llevando la encapsulación demasiado lejos en este caso.

Suponga que tiene un control de usuario que es solo una tabla o una vista de cuadrícula de varios datos de usuario. Inevitablemente, ese control de usuario necesitará saber sobre el identificador único del usuario para extraer sus datos de donde sea que esté, lo que por supuesto lo obliga a crear una propiedad pública que la página principal puede establecer.

Además, tenga en cuenta que habrá momentos en que una acción dentro del control de un usuario debe desencadenar una acción en el padre. Los delegados de eventos entran en juego aquí, y son extremadamente útiles y, en mi opinión, hacen que los controles del usuario sean aún más útiles.

Simplemente deje caer la idea de que los controles de usuario y los padres no hablan de un lado a otro, y encontrará las cosas mucho más fáciles.

¿Entonces tiene algunas cosas dentro de este control de usuario que se unirán a un conjunto de datos que devuelve el procedimiento almacenado?

Aquí hay una forma de manejarlo: En lugar de intentar comunicar el procedimiento almacenado al control del usuario, cree el conjunto de datos que el control del usuario dependerá de una propiedad pública del control del usuario.

En tiempo de ejecución, su código que está fuera del control del usuario ejecutará el procedimiento almacenado apropiado y establecerá la propiedad del conjunto de datos en su control de usuario para el resultado devuelto por el proceso almacenado.

Como todos los demás lo han señalado, su control de usuario debe tener una forma estándar de comunicar sus intenciones y comportamientos. Esto no significa que deba tener una referencia al contenedor y, por lo tanto, saber qué (MyPage.aspx) realmente lo contiene.

Lo que he encontrado indispensable al trabajar con controles de usuario son los eventos. Aprende eventos y cómo usarlos. Los eventos son una excelente forma de comunicar el comportamiento.

En su ejemplo, puedo dividir sus criterios (cuadros de texto de fecha) en su propio control de usuario. Cree una nueva clase que herede de EventArgs, que contenga sus criterios (DateTime campos). Cuando el usuario hace clic en buscar, active un evento (de tipo EventHandler<YourEventArgs>) con su EventArgs personalizado. La página manejará el evento, consultará la base de datos y luego pasará los resultados a un método público o interno en su segundo control de usuario, que muestra los registros.

La clave aquí, su control de criterios se puede reutilizar en diferentes páginas si necesita llamar a diferentes procedimientos almacenados. Piense en los escenarios de inserción vs actualización. Muchas veces, los elementos de la interfaz de usuario son los mismos. Puede crear un control y usarlo en dos páginas diferentes con dos comportamientos diferentes (AddRecord.aspx y UpdateRecord.aspx). Además, su control que muestra registros se reutiliza muy fácilmente.

Una gran ventaja es que sus páginas y controles se vuelven bastante pequeños. Cada control / página realmente solo se preocupa por su pequeño subconjunto de funcionalidad. Su código será menos desalentador y más fácil de mantener.

  

" tell " el usuario controla qué procedimiento almacenado me gustaría ejecutar

Parece que estás buscando eventos / delegados
Haga que el control exponga un evento y deje que el padre agregue un controlador (quizás en el constructor, si desea forzarlo a agregar un solo evento)
Alternativamente, puede usar el patrón de Comando / Estrategia: haga que el padre encapsule el método y envíe el objeto de encapsulación al control en su constructor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top