Pregunta

Supongamos que tengo un treeview, donde cada treenode contiene un identificador para un conjunto diferente de los controles de usuario.Cuando el usuario hace clic en un nodo, estos controles deben ser cargados a la página.Entiendo que la página ASP ciclo de vida, la dinámica de los controles debe ser agregado en la etapa de inicialización, y la devolución de los eventos de incendio en el futuro.

Así que si la vista en árbol, haga clic en evento ocurre después de que debo agregar a mi controles, ¿cómo puedo agregar dinámicamente controles basados en eventos de devolución?


Editar:He probado la sugerencia de ArronLS:

Yo lo que hice fue agregar el nodo de valor para el período de sesiones de la matriz, y el uso que cuando hago el init para que elija el que forma la carga de elementos para los controles de un control de marcador de posición.En la vista en árbol, haga clic en evento, puedo actualizar el nodo en la sesión de la matriz, claro la antigua forma de los elementos en el marcador, y agregar nuevos elementos de formulario a los controles.Cuando la página se carga de nuevo, ahora debe encontrar el nodo en el tiempo de inicialización, por lo que viewstate problemas podrían ser evitados.

Ahora yo aún no has probado aún, pero había otro puesto similar que habla acerca de los problemas que pudieran derivarse con el viewstate.Ellos sugieren una solución que las encuestas de la Solicitud[] parte del contexto (en su caso, el de dropbox) en el Init de control, la manipulación manual de algunos de devolución de funcionalidad.

Mi nueva pregunta es cómo puedo acceder a el nodo seleccionado en la vista en árbol mediante la Solicitud de la matriz?

¿Fue útil?

Solución

La consecuencia de no cargar los controles en init es que si hay cambios en las propiedades en el estado de vista, no va a conseguir persistió a los controles.Por ejemplo, si en la primera solicitud de la página, crear dinámicamente los controles en init, a continuación, en el post de nuevo se crea de nuevo en el init, a continuación, después de la inicialización, los valores de la propiedad en el viewstate se aplica al control.

Así que si usted crea el control inicialmente en una vista en árbol de evento click, me imagino que debe estar bien, porque no hay todavía ninguna viewstate acumulado a aplicar para el control, puesto que se acaba de crear.Sin embargo, no estoy seguro de si esto va a provocar que el control no guardar viewstate.Tendrías que experimentar con eso.

En posteriores devoluciones después de la primera, ahora tendrá que crear el control en init acumuladas viestate a ser aplicado, así que usted necesitará algún tipo de mecanismo para "recordar" que creó el control una vez antes, inicialmente en respuesta al evento click, y luego en posteriores devoluciones crear el control de nuevo en init.Tiene que volver a crear el control en cada solicitud, si usted no lo sabía.

Así que la pregunta es: ¿cómo de importante es el viewstate para el control.

Editar:También voy a añadir que no estoy del todo seguro de si habría otra consecuencia distinta de cómo esto afecta a viewstate.

Otros consejos

Esto no puede ser una respuesta a su pregunta directa, pero ya que nunca he encontrado una respuesta a mí mismo, aquí está la solución que he usado.

El método que he utilizado siempre cuando se trabaja con un TreeView es declarar los controles en la página aspx una vez, y luego en el evento click, se unen los controles de la de los datos basado en el ID. Si es necesario, se puede establecer inicialmente la visibilidad a = visibles "falsa" y cambiarlo cuando se unen. Este enfoque funciona muy bien, ya que evita simplemente el enigma que está describiendo.

Si usted no está opone a renunciar a treeviews, un anidada repetidor obras de aproximación así, también.

Simplemente tirar otro pensamiento, con la esperanza de conseguir algo más comentarios ...

Yo podría utilizar el evento de devolución de datos para definir el valor seleccionado en la matriz de la sesión, y luego obligar a la página de redirección a sí mismo. A continuación, el init que el usuario ve efectivamente se llevará a cabo después de que el controlador de eventos se ha disparado.

Parece una mala idea, así que estoy esperando por algo más.

Si le he entendido bien que usted quiere diverso contenido que se muestra para cada nodo del árbol. Asumo theres la vista de árbol de la izquierda y un área de contenido en el medio.

Desde una perspectiva de interfaz de usuario que normalmente resolver esto mediante el uso de un MultiView donde cada vista individual es un control de usuario separada con el contenido requerido. El evento NodoArbol clic simplemente cambia el MultiView ActiveIndex contenida en la propiedad del valor de nodo (ID se almacena en el DataItem) y simplemente cambiar el área de contenido.

En general, incluso si los nodos del árbol se generan de forma dinámica, a partir de datos, por ejemplo, no siempre será solamente una cantidad finita de controles de usuario "Nodo View" que debe definir.

Nota. Tenga cuidado al usar el control MultiView ya que todos los puntos de vista contenidos se cargan durante el ciclo de vida de la página, así que no pone ningún "trabajo pesado" en Load etc.

Se puede ayudar a recordar que el ID del nodo seleccionado se pasa como un valor forma, que siempre es accesible desde la colección Request.Form, incluso durante el evento Init. La clave sería algo así como ctl00_Content1_TreeView1_SelectedNode. Sin embargo, ese ID solas probablemente no obtendrá el valor que necesita, por lo que se quiere mirar a Request.Form["__EVENTARGUMENT"] y también utilizar Request.Form["__EVENTTARGET"] para comprobar que se trataba del TreeView que causó la devolución de datos.

Es muy probable que la información que necesita se puede sacar de la colección de formularios. Es sólo una cuestión de establecer un punto de interrupción y el examen de los valores. Este tipo de código siempre se siente muy hacky, pero en este caso no puede esperar para el evento del control TreeView para ser manipulados cuando se necesita utilizar los valores presentados en la forma de hacer algo durante Page_Init. Eso sí, no tenga miedo de mirar los valores del formulario en lugar de esperar a que .NET para empaquetar todo muy bien con propiedades de tipo fuerte. Para entonces será demasiado tarde.

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