miércoles, 27 de junio de 2012

[ASP.NET] PopUp Edición - Usando Ajax Toolkit ModalPopupExtender

 

Introducción

Editar información de un registro puede implicar el navegar de una pagina hacia otra, pero también podría aplicarse otras técnicas como ser el desplegar un dialogo que facilite esta tarea al usuario

 

Implementado AutoCompleteExtender

La búsqueda rápida de un cliente por medio de la aproximación mientras se va escribiendo consta de dos parte, una en el html donde se vincula los controles asp.net con el AutoCompleteExtender, definiendo en este tres propiedades importantes: TargetControlID, ServicePath y ServiceMethod

<div id="search" style="width:100%;height:100%">

    <div class="row">
        <div class="cell searchcell">
            <asp:Label ID="Label1" runat="server" Text="Nombre Compañia:"></asp:Label>
            <asp:TextBox ID="txtCustomer" runat="server" Width="200px" />
            <asp:AutoCompleteExtender ID="aceCustomer" runat="server"
                TargetControlID="txtCustomer"
                ServiceMethod="GetCustomerList"
                ServicePath="Default.aspx"
                MinimumPrefixLength="2"
                CompletionInterval="1000"
                EnableCaching="true"
                CompletionSetCount="12" />
        </div>
    </div>
    <div class="row">
        <div class="cell searchcell" style="text-align:right;">
            <asp:Button ID="btnFiltrar" runat="server" Text="Filtrar" CssClass="button"
                onclick="btnFiltrar_Click" />
        </div>
    </div>

</div>

Es por eso que en la pagina se define el código del servicio encargado de retornar la lista de string de respuesta.

[WebMethod]
[ScriptMethod]
public static string[] GetCustomerList(string prefixText, int count)
{
     string[] list = CustomerRepository.GetCustomer(prefixText, count)
                            .Select(x => x.CompanyName)
                            .ToArray();

     return list;
}

Implementando ModalPopupExtender

Como en este caso es necesario realizar la carga de datos en los controles que formaran el dialogo de edición se deberá realizar un postback al servidor en un evento previo a mostrar el popup.

Para poder llevar esto a cabo se requiere adaptar el modalpopup, asignando el target a un control hidden para poder engañarlo y así dejar libre la acción del gridview.

Al realizar esto se podrá controlar desde el servidor cuando se desplego el dialogo, desde el evento del gridview se realizara la carga de la info en el panel para terminar con el show del dialogo.

protected void gvOrders_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
    int OrderId = Convert.ToInt32(gvOrders.DataKeys[e.NewSelectedIndex].Value);

    InitializeEditPopUp();
    LoadEditData(OrderId);

    mpeEditOrder.Show();
}

El resto del ejemplo lo compone el dialogo de edición, en este caso no se hiso uso de tabla html, sino que se opto por usar css tables.

 

Persistencia


Para guardar y recuperar la información de la base se hace uso de Entity Framework Code First, se utiliza este por lo practico de su uso.

No se pone aquí la definición de todas las clases del dominio ya que puede descargarse el código para un mayor detalle, pero si se plantea la definición del mapeo para que pueda observarse lo simple que este queda.

public class NorthwindContext : DbContext
    {

        public NorthwindContext()
            : base("Northwind")
        {
            Database.SetInitializer<NorthwindContext>(null);
        }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            modelBuilder.Entity<Order>()
                            .HasKey(x => x.OrderID);
            
            modelBuilder.Entity<Order>()
                            .HasOptional(x => x.Customers)
                            .WithMany(x=>x.Orders)
                            .HasForeignKey(x=>x.CustomerID);

            modelBuilder.Entity<Order>()
                             .HasOptional(x => x.Shipper)
                             .WithMany(x=>x.Orders)
                             .HasForeignKey(x=>x.ShipVia);

            modelBuilder.Entity<Order>()
                             .HasOptional(x => x.Employees)
                             .WithMany(x => x.Orders)
                             .HasForeignKey(x => x.EmployeeID);
            

            modelBuilder.Entity<Customer>()
                            .HasKey(x => x.CustomerID);

            modelBuilder.Entity<Product>()
                            .HasKey(x => x.ProductID);

            modelBuilder.Entity<Shipper>()
                            .HasKey(x => x.ShipperID);


            modelBuilder.Entity<Employe>().ToTable("Employees");
            
            modelBuilder.Entity<Employe>()
                             .HasKey(x => x.EmployeeID)
                             .Ignore(x=>x.FullName);

        }

        public DbSet<Customer> Customers { get; set; }
        public DbSet<Order> Orders { get; set; }
        public DbSet<Shipper> Shippers { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<Employe> Employees { get; set; }

    }

Problemas encontrados

Durante la realización del articulo encontré algunos problemas que podrían considerarse como tips a tener en cuenta.

ReadOnly en TextBox con CalendarExtender

Para permitir al usuario seleccionar una fecha se hace uso de CalendarExtender, algo que se quería evitar es el por escribir, por eso se asigno la propiedad ReadOnly="true", el resultado de esto fue que el control no tomaba la selección de la fecha cuando se lo consultaba en el evento del server.

Se debió quitar el ReadOnly para que el control volviera a funcionar

Controles de Validación

Para la validación de algunos controles se hizo uso de controles de asp.net, los cuales se encontraban dentro del Panel que se despliega en el popup. El uso de estos controles hacia que eventos no se lanzaran.

El problema se debía que los controles de validación dentro del modalpopup no tener el mismo nombre en la propiedad ValidationGroup, solo fue cuestión de asignar un mismo nombre de grupo y se resolvió.

 

Código

Para el ejemplo se hace uso de Visual Studio 21010, la base de datos es Sql Compract 3.5

   

91 comentarios:

  1. Hola Leandro. Mi nombre es Bruno y estoy creando un Framework para el desarrollo de aplicaciones web en .NET.
    Mi objetivo es, a través de este Framework, llegar a desarrollar una aplicación entera sin el uso de un solo Postaback. Te invito a que sigas mi blog para que compartamos la experiencia.
    Saludos
    Bruno

    ResponderEliminar
  2. hola monimisi

    si lo que planteas esta interesante

    no has evaluado investigar por el lado de jqGrid o jTemplate para programar muchio mas orientado a jquery

    esto permite realizar aplicacion que no usen ningun evento de asp.net y puedas controlar completo como recibes y envias los datos, mas que nada usando $.ajax

    estaba justo armando un articulo sobre esto, igual va a contener un mix con evento asp.net, pero podria servir de guia

    mi idea es ir mas a asp.net mvc, he ir dejando asp.net, creo que para erradicar el tema del postback no hay mejor que mvc, las implementaciones quedan bien limpias

    saludos

    ResponderEliminar
  3. hola que tal estoy desarrollando en asp .net y lo que tengo es que el popup no se muestra en iPad en el pc funciona sin problemas podrias orientarme ???

    ResponderEliminar
  4. hola

    estas sobre que browser se visualiza la pagina?
    lo pregunto porque no todos soportan la funcionalidad completeta de javascript

    no has evaluado crear un popup con jquery UI Dialog, este tiende a ser mas compatible

    saludos

    ResponderEliminar
  5. hola estimado, una gran consulta como podria hacer para poder abrir ese poppup y que permita hacer una busqueda en dicho poppup que me muestre en una grilla el resultado de la busqueda y luego selecciono una fila del poppup y que me retorne a la ventana padre lo estoy intentando y no me sale por favor ayudaaa

    ResponderEliminar
  6. hola Oscar

    podrias dentro del popup usar el UpdatePanel dee sta forma lanzar un evento que busque y filtre los datos del grid que tiene el propio popup

    no se cerrara el dialogo porque el UpdatePanel evitara el refresco de la pagina, solo actualizara el grid que estara dentro del popup

    saludos

    ResponderEliminar
  7. esta bueno donde puedo bajar el codigo fuente para ver su funcionamiento
    freddy

    ResponderEliminar
  8. hola Freddy

    al final del articulo esta la seccion de codigo donde puedes descargarlo

    saludos

    ResponderEliminar
  9. Hola leandro mi nombre es ChriZ tengo un jq colorbox modalidad popup y me pasa lo que mencionas en tu post que cuando abro asocia un control que tengo dentro de tipo dropdownlist al javascript y no me permite entrar al evento selected indexchanged, como podria desasociar el javascript puesto que ahi no existe la propiedad TargetcONTROLid.. Muchas Gracias

    ResponderEliminar
  10. hola ChriZ

    no se si entendi el planteo

    tienes un dropdownlist que no lanza el evento SelectedIndexChanged al servidor ?
    si es asi asignaste la propiedad AutoPostBack = true


    saludos

    ResponderEliminar
  11. Efectivamente tenia un dropdownlist en un jq colorbox pero me daba muchos problemas asi es que decidi hacerlo con este control de ajax lo invoco al hacer click en un boton y me funciona perfecto, el problema esta cuando le doy click en salir o actualizar y vuelve a la pagina padre mis botones ya no esta entrando a los eventos, alguna idea de como solucionarlo. Gracias de antemano

    ResponderEliminar
  12. hola

    la verdad no se que sera este jq colorbox que comentas, la verdad no lo he usado nunca

    saludos

    ResponderEliminar
  13. en realiodad como te comentaba ya no estoy usando eso del jq colorbox, estoy usando lo que planteas aqui, y como te decia el problema esta cuando le doy cli en el boton salir del mpe es decir cuando se dispara el evento click del boton cerrar (.hide()), es decir cuando retorna a la pagina padre al hacer clic en cualquier boton ya no realiza ninguna accion, es decir no entra al codigo del evento.... Alguna idea porfa... gracias

    ResponderEliminar
  14. leandro, para ser mas exacto estuve indagando sobre mi problema y vi que el error es con el toolscriptmanager, me bota error de control nullexception createdpanel[2], vi una posible solucioj de poner el scriptmode=release pero no ha funcionado, te sucedio algo similar???

    ResponderEliminar
  15. hola ChriZ

    la verdad no recuerdo algo similar a lo que comentas
    aunque parece ser por el mensaje de error que fala algo de javascript en el cliente
    lo que no entiendo es que sera este createdpanel, de casualidad usar algun control de ajax toolkit como ser un Tabcontrol o similar?

    para encontrar el problema podrias ir simpleficando la pagina quizas quitando funcionalidad y probando hasta ver que control es el que genera conflicto

    saludos

    ResponderEliminar
  16. Hola Leandro es posible abrir una ventana popup desde otro popup con el metodo que planteas.

    ResponderEliminar
  17. hola DYAGO

    se deberia poder, aunque se que hay unos temas de superposicion que deben definirse mediante estilos

    http://social.msdn.microsoft.com/Forums/es-ES/netfxwebes/thread/ea0e3c35-adc2-4333-941a-adeda1315272

    saludos

    ResponderEliminar
  18. HOLA LEAndro buen dia... tengo una consulta que tarda entre 6 y 8 segundos loesmuestro en un gridview,, pero me gustaria poner un popup de "cargando" mientras hace la consulta.
    hice algo similar al ejemplo pero no muestra nada.. o alguna idea

    ResponderEliminar
  19. hola germanRive

    podrias usar el UpdateProgress

    [How Do I:] Use the ASP.NET AJAX UpdateProgress Control?

    aunque quizas para esto tengas que tambien utilizar el UpdatePanel

    saludos

    ResponderEliminar
  20. Hola Leandro

    Estoy intentando adaptar tu código a mi proyecto. No consigo abrir el popup haciendo clic en el dibujito del lápiz si lo he conseguido haciendo un botón nuevo y cambiando el TargetControlID al id del botón.

    ¿Tienes idea por que lo hace?

    A parte de esto, ¿conoces a alguien que lo haya conseguido traducir al VB?

    Un saludo, Jaume

    ResponderEliminar
  21. hola Jaume

    en el grid defines un CommandName al icono del lapiz que esta dentro del grid ?
    si es asi defines tambien el evento SelectedIndexChanged

    porque debe darse un postback para que el dialogo se muestre, ya que al ir al servidor este indica el Show()

    saludos

    ResponderEliminar
  22. Hola Leandro.

    Si defino un CommandName al icono del lapiz que está dentro del grid, pero no el evento SelectedIndexChanged.
    Me he centrado mucho en tu ejemplo (problema está en c# y me cuesta un poco). Lo he traducido a Vb con el SharpDevelop pero me da problemas que posiblemente no tengan nada que ver con ello.
    El error es: "No se encuentra el proveedor de datos .NET Framework solicitado. Puede que no esté instalado." que sale despues de ponerle "hi" en nombre de compañia.
    Yo uso Visual Web Developer 2010 y SQLExpress Edition 2008.

    Un saludo, Jaume

    ResponderEliminar
  23. hola Jaume


    si defines un CommandName con el texto Select esto lanzara el evento SelectedIndexChanged

    alli podrias tomar la row del grid seleccionada

    lo del proveedor de datos pareciera que se quiere conectar a una base de datos, quizas habria que validar el connection string


    saludos

    ResponderEliminar
  24. Hola Leandro.

    ¿Hay alguna posibilidad que puedas repasarme el código? Ahora resulta que cuando lo veo en el navegador me da un error: "Error en tiempo de ejecución de Microsoft JScript: No se puede obtener valor de la propiedad 'UI': el objeto es nulo o está sin definir", le doy al botón de continuar y me presenta el GridView y debajo el popup que debería estar oculto.

    Un saludo

    ResponderEliminar
  25. hola Jaume

    validaste que los .js de las librerias de jquery y jquery UI esten cargando de forma correcta?

    porque por el mensaje pareciera que alguna .js no la defines de forma correcta

    puedes usar fiddler, las developer tools del IE (lo accedes con F12), o quizas firebug de firefox para analizar que .js se estan cargando en la pagina

    saludos

    ResponderEliminar
  26. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  27. Buenos días Leandro.

    El error que me da, lo evito borrando el control asp:ModalPopupExtender y claro no hace nada mas que mostrar el grid.

    Arrastro un ModalPopupExtender del cuadro de herramientas de Ajax Controltool Kit y sin configurarlo me da el error de que le falta el TargetControlID.

    Lo configuro de la siguiente manera:





    Y es en este momento cuando me da el error que te he comentado en el anterior comentario.

    Prácticamente he copiado tu ejemplo cambiando el código C# a Vb.

    Un saludo, Jaume

    ResponderEliminar
  28. Leandro:

    ¿Por que no se ve el código que he escrito?

    Jaume

    ResponderEliminar
  29. hola Jaume

    deberias poner el codigo como texto plano, es un editor muy simple del del blog no soporta nada complejo.
    Sino deberias llevar la pregunta al foro de msdn

    Ademas del error de targecontroltid no hay ningun otro que este mencionando ?

    le defines un control hidden por target?

    saludos

    ResponderEliminar
  30. Buenas tardes Leandro:

    He cambiado de ordenador y he vuelto al antiguo y funciona perfectamente. ¿Que és? Ni idea. Ya iré buscando.

    Siguiendo en la conversación del 6 he hecho lo que me dices y funciona perfectamente. Ya dispara el popup cuando pincho sobre el dibujito.

    Voy a continuar porque ahora me tiene que mostrar los datos.

    ¿Tienes algún consejo para ello?

    Muchas gracias. Jaume.

    ResponderEliminar
  31. Buenos días Leandro:

    Cuando clicas sobre el icono en el gridview para editar el registro en el popup ¿Como sabe en que registro he clicado para poder editarlo?

    Te recuerdo que no uso SQL Server sino BD de Access con Vb.

    Antes de hacer el show() debo pasar los datos del registro a las variables del formulario popup. Lo he probado con varialbes fijas de texto y me va bien. Ahora me falta capturar las del registro de la tabla.

    Gracias, Jaume

    ResponderEliminar
  32. hola Jaume

    veras en el evento SelectedIndexChanged del gridview la linea:

    int OrderId = Convert.ToInt32(gvOrders.DataKeys[e.NewSelectedIndex].Value);

    esa es la que usa para conocer cual es el id del registro seleccionado que debe editar

    saludos

    ResponderEliminar
  33. Buenos días Leandro:

    En Vb, ¿Como hago para que cuando pulso el botón de aceptar en el popup me actualice el grid al que regreso?

    Gracias, Jaume

    ResponderEliminar
  34. hola Jaume

    si revisas el articulo veras el evento btnActualizar_Click

    en este invoca al LoadGridOrder() para recargar el grid luego de insertar la orden

    saludos

    ResponderEliminar
  35. Buenos días Leandro.

    En el LoadGridOrder() se ejecutan dos órdenes, y no entiendo la primera: gvOrders.Datasource=OrderRepository.GetOrdersByCustomer(txtCustomer.Text)

    Comentarte que uso una tabla en una bdaccess y el gridview funciona con un ADT a la tabla, por si cambia algo.

    Gracias

    ResponderEliminar
  36. hola Jaume

    lo que haces alli es consultar al repositorio o sea a la base de datos para que devuelva una lista de ordenes de compra y en la misma operacion lo asignas como origen de datos al gridview

    o sea recuperas de la db las ordenes y las asignas al grid para poder visualizarlas

    ese repository representa la capa de datos

    saludos

    ResponderEliminar
  37. Buenos días, Leandro:

    NO consigo actualizar el gridview cuando salgo del popup. No entiendo bien tu sistema. Te recuerdo que uso bds Acces y el AccessDataSource para los datos del GridView.

    El resto lo he terminado y funciona perfectamente.

    Gracias.

    ResponderEliminar
  38. Hola Leandro

    Yo implemente el modal popup en mi sitio dentro de un boton de la master page que me muestra una tabla que se debe llenar, el problema es que cuando le doy clic en guardar dentro de la tabla de eso modal cuando hace el postback para redireccionarme a la pagina de inicio despues de haber guardado se muestra el contenido del modal popup en forma como transparente y me descompone toda mi pagina, como puedo corregir esto???? ayudaaaaaaaaaaaaa

    ResponderEliminar
  39. hola Jaume

    el popup lo defines dentro de la misma pagina, por lo cual tienes acceso a los metodos y controles que alli definas

    si al cerrar el popup se lanza un evento al servidor alli podrias invocar el metodos que recarga el grid

    en ese metodo consultarias los datoa de la db y asignarias el DataSource del gridview

    saludos

    ResponderEliminar
  40. hola CarIg

    de casualidad la accion que describes esta enmarcada con algun UpdatePanel ?

    porque si al accionar algun evento dentro del postback se actualiza toda la pagina el popup deberia perderse

    es mas usar un redirect si ademas defines un UpdatePanel no esta del todo correcto
    quizas deberias enviar javascriot al cliente que realice un

    window.location.href = "pagina.aspx";

    y asi redirecciona pero desde el cliente, esto es si hay un updatepanel

    saludos

    ResponderEliminar
  41. Hola Leandro!

    Estoy desarrollando una aplicacion en ASP.NET que utiliza modals pop up para mostrar mensajes de informacion, error o advertencia. Ahora bien..el pop up es un panel con un label que contiene el mensaje, que le es pasado por parametro cada vez que se invoca el pop up, junto con el "estilo" de ventana a mostrar (los estilos los tengo en un css aparte).
    Ahora bien, esto me funciona en algunas pagina de mi proyecto sin problemas y en otras no me muestra ni el estilo ni el mensaje del label. Si aparece el pop up.
    Me olvide de comentarte que el pop up se encuentra en una master page de la cual heredan todas las paginas de mi proyecto.
    Alguna idea de porque pasa este comportamiento?

    ResponderEliminar
  42. Buenos días, Leandro:

    ¿Sería posible añadir un botón de borrado de registro al lado del que ya existe de edición?
    Si es que sí, ¿dónde lo coloco y como lo lanzo?

    Un saludo, Jaume

    ResponderEliminar
  43. hola Leo Pino

    validaste que la definicion del tag <link> apunta de forma correcta al css

    puede que de una pagina a otra este relativo al css de forma diferente, quizas en alguna pagina uses ../ y en otro no tengas que hacerlo

    usa el developer tool al cual accedes con F12 para ver que carga la pagina, o sino usa fiddler

    saludos

    ResponderEliminar
  44. hola Jaume

    podrias poner el boton de eliminar en el propio gridview

    [ASP.NET] GridView – Edición Empleados

    en el articulo explico como implementarlo

    saludos

    ResponderEliminar
  45. Buenos días Leandro:

    Terminé el proyecto y va perfectamente.

    Siguiente problema: Lo estaba haciendo aparte del proyecto principal. Ahora lo he importado dentro del proyecto principal y todo son errores. La estructura es la misma, donde se ubica, donde estan las imagenes. El fallo está en que en el código VB no reconoce los campos del código ASPx. ¿Dónde estoy fallando?

    Gracias.

    ResponderEliminar
  46. Buenos días Leandro:

    Ya funciona. El problema estaba en el "inherits" que no le ponía el nombre de la clase bien.

    Muchas gracias por todo.

    ResponderEliminar
  47. Buenas tardes Leandro.

    Poco dura la alegría.
    Estoy añadiendo controles de validación a los campos de texto (texbox)y me surge un problemilla: un campo con asp:regularExpressionValidatos funciona perfectamente. Si le pongo un dato que no se ciña a lo que le he dicho sale el mensajito.
    El que no me funciona es el asp:RequiredFielValidator ya que al darle al botón aceptar para que haga los cambios aunque los campos estén vacios realiza los cambios.

    Un saludo, Jaume

    ResponderEliminar
  48. hola Jaume

    imagino por el planteo esto lo estas realizando dentro de la ventana popup del modalpopupextender no ?

    la verdad es raro que un tipo de validacion funcione y otro que deberia ser mas simple no lo haga, por lo gneerar o funcionan todas las validaciones o no funciona ninguna

    verificaste que las validaciones esten dentro del updatepanel ? imagino deberian estar pero por las dudas

    saludos

    ResponderEliminar
  49. Buenos días Leandro

    SI tengo un asp:updatepanel al principio del popup bien cerado al final. Me muevo entre los campos y si queda vacio no pasa nada, en cambio el que me obliga a escribir el nombre con un formato asp:regularExpressionValidator si que si se lo pongo mal funciona. En el boton de grabar he puesto un if page.Isvalid then y tampoco.

    Saludos, Jaume

    ResponderEliminar
  50. Buenos días, Leandro.

    He encontrado el problema. No habia puesto la clausula ValidationGroup al botón y por eso no validaba.

    Muchas gracias por tu atención.

    ResponderEliminar
  51. hola Jaume

    la verdad esta raro, porque el hecho que un tipo de control de validacion funcione y el otro no, como que no se explica

    verificaste que el control de validacion este coorrectamente asignado al textbox que debe validar

    veo que defines un popup en un updatepanel, pero que pasa si comentas el updatepanel, funcionan las validaciones?

    si al mismo control le asignas una validacion de expression regular prueba quitarsela y solo deja la del textbox requerido

    saludos

    ResponderEliminar
  52. Buenos días, Leandro

    Gracias por tu ayuda, ya ves que sirve de algo ya que el proyecto avanza e incluso crece.

    Ahora me gustaría que cuando pulso el botón de borrar registro (que ya funciona y lo borra) me salga un popup que al menos me avise de que voy a borrarlo. He creado otro panel asignado a un asp:modalpopupextender igualito que el que edito el registro, pero solo con un aviso de borrado y dos botones, aceptar y cancelar.
    He cambiado los códigos para que cuando pulso el botón de borrado lance con un popup.show() el popup oculto de Acepto/Cancelo. He asignado el código de borrado de registro al evento.click del botón Acepto, pero no hace nada ya que no reconoce las órdenes donde capturo el registro, lo muevo y lo borro. ¿Se te ocurre algo?

    Gracias, Jaume

    ResponderEliminar
  53. hola Jaume

    a ese boton de "Acepto" le aplicas la misma tecnica de asignar un hidden al modalpopupextender para que habilite los eventos en el servidor ?

    porque sino el popupextender solo permite definir codigo del lado del cliente con javascript

    saludos

    ResponderEliminar
  54. Buenos días Leandro.

    Si, he creado un hidden y un modalpopupextender nuevos el cual lanzo al pulsar el boton de borrar pero si creo un codigo en la parte de vb con un if, que si es aceptar borre y si no nada, me ejecuta el nada antes de pulsar aceptar o cancelar.

    Jaume

    ResponderEliminar
  55. hola Jaume

    no veo porque la razon del if, o sea el boton lanza el evento de borrar lo cual se debe realizar directamente

    cuando se presiona el boton ya se esta aceptando, que otra confirmacion realzias para tner que implementar ese "if"

    a lo sumo si se requiere una confirmacion sera con codigo javascript el cual inhabilite el postback de la accion boton delete

    saludos

    ResponderEliminar
  56. Buenos días Leandro.

    Había dejado a un lado este tema para pasar a otro como habrás podido comprobar con mis otras preguntas en MSDN.
    Voy a empezar la explicación desde el principio ya que cuando escribo con prisas me explico muy mal.
    Prefieres que siga con el tema del aviso cuando borro un registro por este blog o te lo pregunto por MSDN.

    Un saludo, Jaume

    ResponderEliminar
  57. hola Jaume

    creo que el foro en msdn es un mejor sitio para plantear la pregunta, mas si tienes que poner codigo o imagenes

    desde aqui se complica un poco para analizar codigo

    saludos

    ResponderEliminar
  58. Buenas Leandro.
    Quisiera hacer una pequeña consulta, ojala me puedas ayudar.
    Es posible a traves de un PopUp abrir un web Forms ya creado, con sus elementos y todo?

    Mucho agradecere tu respuesta.

    Atte.

    ResponderEliminar
  59. hola Mauricio

    si dentro del popup defines un <iframe> podrias cargar alli una pagina aspx
    el tema es que de por si la pagina tiene tags html, y su propio viewstate el cual entraria en conflicto con el de la pagina base
    no se puede cargar dos tag html, body, etc en el browser
    por eso el iframe ayudaria en ese caso

    esto es mas natural si usaras asp.net mvc ya que podrias definir un partial view y cargar esto dentro del popup de forma dinamica

    saludos

    ResponderEliminar
  60. Estimado,

    Muchas gracias por tu respuesta, solo queria consultar por lo ultimo que me respondiste, ya que no entendi muy bien lo del partial view.

    Saludos

    ResponderEliminar
  61. hola Mauricio

    lo del partial view lo comente si es que usabas ASP.NET MVC
    para asp.net simple no aplica

    o sea la version mvc de asp.net tiene soporte para realizar lo que planteas, pero asp.net no es tan directo

    ojo se podrian simular vistas parciales si renderizas User Control dentro del popup

    saludos

    ResponderEliminar
  62. Como le hago para agregarle un scroll en el popup?

    ResponderEliminar
  63. hola Manuel

    dentro del popup podrias definir un div con otro div dentro para asi asignar el estilo

    Ejemplo de Scroll en div overflow

    saludos

    ResponderEliminar
  64. Oye Leandro una pregunta, Como hago para que ASP me reconozca ToolkitScriptManager

    Me marca:

    Etiqueta de servidor 'ASP:ToolkitScriptManager' Desconocida

    igual pasa con AutoCompleteExtender
    ModalPopupExtender

    y asi !!

    ResponderEliminar
  65. hola Miguel

    agregaste la referencia a las dll de ajaxtookit?

    si lo hiciste valida que sea una de las ultimas versiones, porque este componente no existia en las versiones de ajaxtookit mas antiguas

    recuerda ademas definir la linea

    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>

    que podras ver al principio del aspx

    saludos

    ResponderEliminar
  66. ok ya lo resolví, pero ahora me marca un error en todos los proyectos en las paginas maestras !!

    https://lh4.googleusercontent.com/-u77RH6BG8fI/Uq-jTDeLVLI/AAAAAAAAAvI/xVB7uX00OhI/w955-h575-no/Sin+t%25C3%25ADtulo.png

    ResponderEliminar
  67. hola Miguel

    usas algun plugin para el VS que valide sintaxis o te ayude a refactorizar el codigo estilo ReSharper ?

    lo pregunto prque el Vs no tiene la funcionalidad de mostrar los mensajes de error de javascript alli donde lo estas visuaalizando en la imagen

    pareciera que algo esta comprobando sintaxis de javascript, pero no veo que sea algo del VS

    ademas marca error de javascript, peor no veo alli que definas codigo cliente o la referencia a algun .js, o quizas este definido mas abajo en la master page

    saludos

    ResponderEliminar
  68. Me sirvió mucho los tips, ya q los controles de validación me daban problemas al intentar hacer un postback desde el modal pop up.... muchas gracias...
    fue de mucha ayuda

    ResponderEliminar
  69. buen día Leandro..

    tengo un archivo con código jQuery donde utilizo algunas funciones para mostrar u ocultar algunos divs de acuerdo a la información que el usuario selecciona en un DropDownList de asp.net el caso es que cuando utilizo controles de servidor no funciona mi código JQuery pero cuando utilizo controles de HTML funciona perfectamente igual si pongo el atributo runat="server" en los controles HTML no funcionan las funciones de JQuery no se a que se deba esto. la referencia al archivo la hago en el masterPage de la siguiente forma: src="<%= ResolveUrl("~/Scripts/myCode.js") %>"

    y este es un ejemplo del código que tiene el archivo

    $("<%=#ddlEstatus%>").change(function () {
    if ($("#ddlEstatus").val() == 163) {
    $("#pnCierreCarpeta").show("swing");
    } else {
    $("#pnCierreCarpeta").hide("swing");
    $("#pnOtroCierreCarpeta").hide("swing");
    }
    });

    espero y me puedas ayudar.. gracias..

    ResponderEliminar
  70. Estimado Leandro, tengo un problema en el boton actualizar, quiero mostrar una confirmación para realizar la actualización:

    onclick="return confirm('confirma actualización?')"

    Como podría hacerlo.

    Saludos
    EHN

    ResponderEliminar
  71. hola Pepe

    es un boton de asp.net ? porque si es asi deberias usar el

    OnClientClick

    alli es donde defines el javascript para que ejecute la accion e el cliente antes de invocar el click que envia el post al evento en el servidor
    saludos

    ResponderEliminar
  72. Leandro, veo que llamas al popup desde el server mediante la sentencia mpeEditOrder.Show(), ya que la etiqueta es de asp:ModalPopupExtender.
    Yo tengo el control de ajax toolkit, es decir mi etiqueta es cc1; dime la llamada desde el server seria igual? reconocera mi asp a dicho control en el codebehind?
    Saludos.

    ResponderEliminar
    Respuestas
    1. hola
      si es exactamente igual, el uso de asp o cc1 es el namespace con el cual defines el prefijo que registra el control en el html
      esa linea del Show() la ejecutas desde codigo .net asociado a la pagina
      saludos

      Eliminar
  73. Leandro, y como le hago para obtener el código del cliente seleccionado para posteriormente guardarlo, porque lo que puedo entender es que solo trae los nombre de los cliente.?

    ResponderEliminar
    Respuestas
    1. hola
      no entendi el planteo, te refieres a la edicion o a la implementacion del filtro ? si necesitas enviar mas de un dato selecionado a la pagina padre podrias hacerlo
      saludos

      Eliminar
    2. En la Implementado AutoCompleteExtender el TextBox ID="txtCustomer" es el control del cliente el cual completas desde el webMethod llamado "GetCustomerList", pero como obtengo el código de dicho cliente para poderlo posteriormente guardarlo en la base de dato?

      Gracias.

      Eliminar
    3. hola
      lo mas cercano que pude ver respecto a este tema seria
      Retrieving autocompleteextender's selected item ID
      saludos

      Eliminar
  74. hola
    Disculpa existe una forma de bloquear ciertos días en los calendarexterder??? Estoy haciendo una aplicación en donde es necesario colocar este tipo de calendario pero me solicitan que por ejemplo todos los sábados y domingos y algunos días festivos esten inhabilitados en los calendarios

    ResponderEliminar
  75. Buenos días Leandro.

    Estoy usando este código desde hace un año sin ningún problema, WVista y IE9 en los puestos de trabajo. Ahora nos han suministrador PCs nuevos y llevan W8.1 y IE11. El problema que me surge es que no se ve correctamente con dicho navegador hasta que le activas la "Vista de compatibilidad", pero por políticas de mi empresa no puedo tenerla activada. ¿Cómo puedo solucionarlo? He instalado en .NET Framework 4.5 en los servidores web y sigue igual.
    Muchas gracias.

    ResponderEliminar
  76. hola te comento estoy utilizando un ModalPopupExtender para mostrar que han ingresado correctamente la información de mi pagina pero al implementar este popup no se ejecuta mi boton guardar y se activa directo el popup me puedes ayudar gracias.

    codigo del popup y boton aceptar

    asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="pnlpopup" TargetControlID="bntsalvar" OkControlID="bntaceptar" BackgroundCssClass="modalBackground" DropShadow="true"//Confirmación de Datos

    center style="color: #FFFFFF"> Los datos han sido ingresados correctamente
    asp:Button runat="server" ID="bntaceptar" CssClass="btn-warning focus" Text="Aceptar"

    codigo del boton guardar
    /*
    */
    protected void bntsalvar_Click(object sender, EventArgs e)
    {
    tic.Makana_v3_ingresar_historial( codigo,ddlpersona.SelectedItem.ToString(),int.Parse(ddlpersona.SelectedValue.ToString()),int.Parse(ddlunidad_reg.SelectedValue.ToString()),ddlunidad_reg.SelectedItem.ToString(),txtasunto.Text,Convert.ToDateTime(txtfeccumplimiento.Text),txtusuario.Text);
    }

    gracias por tu respuesta

    ResponderEliminar
    Respuestas
    1. hola
      Para que lance el evento al servidor tienes que definir como TargetControlID un control hidden, entocnes el Show() del popup podras hacerlod esde codigo
      Analiza este ejemplo porque lo explico
      saludos

      Eliminar
    2. muchas gracias por tu guía voy a revisar lo que me comentas, adicional em indicas que en luego de:

      tic.Makana_v3_ingresar_historial( codigo,ddlpersona.SelectedItem.ToString(),int.Parse(ddlpersona.SelectedValue.ToString()),int.Parse(ddlunidad_reg.SelectedValue.ToString()),ddlunidad_reg.SelectedItem.ToString(),txtasunto.Text,Convert.ToDateTime(txtfeccumplimiento.Text),txtusuario.Text);

      mande a llamar el popup? en código de C#? y si es asi me puedes orientar como puedo buscar lo que me comentas.

      Nuevamente gracias por tu ayuda

      Eliminar
  77. Hola Leandro, es posible que vuelvas a subir este ejemplo [ASP.NET] PopUp Edición - Usando Ajax Toolkit ModalPopupExtender el link de descarga no aparece.

    Gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Pude descargar el ejemplo sin problemas, quizas sea un problema momentaneo con onedrive, o quizas sea un problema con el browser, quizas si usas IE.
      saludos

      Eliminar
  78. Hola Leandro. Por favor, como hago para evitar la reapertura de una ventana usando el ModalPoPupExtender al pulsar F5 en el navegador? Mucas gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Si la apertura del popup la realizas desde codigo servidor usando el Show() este se ejecutar porque el refresh del browser envia al servidor el ultimo post que se realizo. No se puede evitar esa accion a menos que despues del post realicen un redirect, pero en tu caso al ejecutar un popup no seria una alterntiva. Podrias mostrar el popup usando javascript.
      saludo

      Eliminar
    2. Perfecto Leandro. Muchas gracias.

      Eliminar
  79. Hola,

    Tengo un problema, cuando seleccionó un valor del AutoCompleteExtender me desaparece el modalpopup y tengo que volver a oprimir el botón para poder visualizar los datos, espero me puedas ayudar a resolver este problema

    ResponderEliminar
  80. Mis respetos, justo lo que andaba buscando y lo mejor, se ve muy bien ! Gracias por compartir !

    ResponderEliminar