none
Pasar mensaje entre capas. RRS feed

  • Pregunta

  • Tengo un sistema con varias capas. En la capa de presentación tengo WebForms, en el cual tengo un GridView al cual le habilité con el SmartTag la opción "habilitar eliminación". El método que hace la "eliminación" es un método que tengo programado en la capa de Entidades, en el cual realizo una validación antes de eliminar. Si la validación es correcta, se elimina el registro y listo. Ahora, si la validación sale mal, ¿cómo puedo pasar desde ese método un mensaje a la capa de presentación para que ésta lo informe al usuario?

    Saludos.

    jueves, 6 de octubre de 2011 13:14

Respuestas

  • claro el team es que suas un ObjectDataSource

    pero si quitas este control y defines un TemplateField con un link con el commandName="Delete" podrias trabajar con el evento, invocando desde codigo al metodo que defines alli en el ObjectDataSource

     

    <asp:TemplateField HeaderText="Mensaje" >
      <ItemTemplate>
       <asp:Label ID="lblMensaje" runat="server"></asp:Label>
        <asp:ImageButton ID="imageButton1" runat="server" CommandName="Delete" />
      </ItemTemplate>
    </asp:TemplateField>

     

    protected void dgvUsuarios_RowCommand(object sender, GridViewCommandEventArgs e)
    {
         
        int idUsuario = Convert.ToInt32(e.CommandArgument);

        if (e.CommandName == "Delete")
        {
            //aqui eliminas
        }
    }

    puedes suar el RowCommand o el RowDeleting es lo mismo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Josecanalla jueves, 6 de octubre de 2011 14:08
    jueves, 6 de octubre de 2011 13:47
  • pero entonces no has visto el ejemplo completo, porque con el indice se hace

    int id = Convert.ToInt32(gvPerson.DataKeys[index].Value);

    o sea usas el DataKeys


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Josecanalla jueves, 6 de octubre de 2011 14:28
    jueves, 6 de octubre de 2011 14:25

Todas las respuestas

  • es un método que tengo programado en la capa de Entidades

    validaciones en la capa de entidades ?

    no has evaluado devolver un Exception como resultado de la validacion y en la UI lo atrapas y muestras en un Label o algun otro control dodne desplegues el mensaje

    es mas podrias crear una Exception custom una business exception

    este mismo terma se planteo aqui

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/31410a75-d0a3-4264-b910-324fc8a576d6

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 6 de octubre de 2011 13:19
  • El prinicipal problema es que no tengo cómo manejarlo en la UI. Yo en el GridView tengo habilitado el "Habilitar eliminación" por lo cual me aparece el hyperlink "Eliminar". ¿Cómo hago para desactivar que el hyperlink "Eliminar" me lo maneje por defecto y poder programarlo yo? Espero que puedas ayudarme con eso, así solucionaría el problema.

    Gracias.

    jueves, 6 de octubre de 2011 13:27
  • hola

    pero no programas el evento

    GridView.RowDeleting Event

    alli es dodne podrias trabajar este tema

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 6 de octubre de 2011 13:35
  • ¿Pero cómo desactivo el manejo por defecto? Es el que toma el DeleteMethod del ObjectDataSource asociado al GridView.
    jueves, 6 de octubre de 2011 13:36
  • Eliminalo desde las propiedades de la grilla 

    , agrega un boton o hiper link, le cambias el nombre y  lo programas tu

    jueves, 6 de octubre de 2011 13:37
  • El problema es que si agrego un hyperlink me pide direccionarlo a una URL, que no es lo que yo quiero. ¿O hay alguna forma de direccionarlo a algún evento?
    jueves, 6 de octubre de 2011 13:39
  • Usando un control Linkbutton, no un Hyperlink.

     

    Saludos,


    Mauricio Atanache G. - MCP - MCC
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    jueves, 6 de octubre de 2011 13:43
  • No encuentro el control LinkButton... tengo VS 2005 por las dudas aclaro.

    Ya lo encontré, pero convirtiendo la columna a Template y agregando el LinkButton en ItemTemplate. Como control de columna no lo encontré.

    • Editado Josecanalla jueves, 6 de octubre de 2011 13:49
    jueves, 6 de octubre de 2011 13:46
  • claro el team es que suas un ObjectDataSource

    pero si quitas este control y defines un TemplateField con un link con el commandName="Delete" podrias trabajar con el evento, invocando desde codigo al metodo que defines alli en el ObjectDataSource

     

    <asp:TemplateField HeaderText="Mensaje" >
      <ItemTemplate>
       <asp:Label ID="lblMensaje" runat="server"></asp:Label>
        <asp:ImageButton ID="imageButton1" runat="server" CommandName="Delete" />
      </ItemTemplate>
    </asp:TemplateField>

     

    protected void dgvUsuarios_RowCommand(object sender, GridViewCommandEventArgs e)
    {
         
        int idUsuario = Convert.ToInt32(e.CommandArgument);

        if (e.CommandName == "Delete")
        {
            //aqui eliminas
        }
    }

    puedes suar el RowCommand o el RowDeleting es lo mismo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Josecanalla jueves, 6 de octubre de 2011 14:08
    jueves, 6 de octubre de 2011 13:47
  • Busca aca...

     

    http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linkbutton(v=vs.80).aspx

     

    Aqui encontraras un muy buen ejemplo de como usarlo dentro de un DataGridView

     

    http://forums.asp.net/t/1016380.aspx/1

     

    Saludos,


    Mauricio Atanache G. - MCP - MCC
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    jueves, 6 de octubre de 2011 13:51
  • +1 a los que apoyan el uso de una excepción.  Es lo correcto, máxime si es una excepción propia de la capa, ya que es más informativo que una excepción genérica.

    Ahora bien, antes de que cambie todo a manual, requerde que las páginas de ASP.net pueden tener un handler para excepciones no manejadas en otras partes.  Se llama Error y hay que ligarlo al método manualmente porque parece ser que AutoWireUp no funciona con este evento particular.  Ver http://msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol.error.aspx.

    Eso sí, personalmente nunca lo he usado y me está costando trabajo encontrar cómo obtener la excepción.  Parece que requiere un poco más de investigación.


    Jose R. MCP
    jueves, 6 de octubre de 2011 13:52
    Moderador
  • Bueno, ahora sólo me falta saber cómo obtener el objeto de la clase "Usuario" asociado a la fila en la cual hace click al LinkButton y ya estamos... ¿cómo puedo hacerlo?
    jueves, 6 de octubre de 2011 13:53
  • Podrias hacer algo como esto :

     

        protected void grdDatos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int index = Convert.ToInt32(e.CommandArgument); 
            if (e.CommandName=="Delete")
            {
                string usuario = grdDatos.Rows[index].Cells[0].Text;
                MetodoEliminaUsuario(usuario);
            }
    
        }
    


    Bueno,  en pseudocodigo....

     

    Saludos,

     


    Mauricio Atanache G. - MCP - MCC
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    jueves, 6 de octubre de 2011 14:00
  • pero obtienes la clase usuario, o solo obtienes el id del usuario ? dudo que puedas obteenr toda una clase

    [ASP.NET][GridView] - Como seleccionar una fila

    como veras usa el DataKeyNames para obtener el id, esto mismo lo puedes hacer en el evento del delete

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 6 de octubre de 2011 14:00
  • Otra version, segun tu plantemiento...

     

     

        protected void grdDatos_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int index = Convert.ToInt32(e.CommandArgument); 
            if (e.CommandName=="Delete")
            {
                Usuario usr = MetodoObtieneUsuario(grdDatos.Rows[index].Cells[0].Text);
                MetodoEliminaUsuario(usr);
            }
    
        }
    

     

    Aqui que debes tener en cuenta, cambiar el nombre del Grid (grdDatos), Creat el evento RowCommand en el Grid, y el identificador del usuario deberia estar en la primera columna del grid.

     

     

    Saludos,


    Mauricio Atanache G. - MCP - MCC
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    jueves, 6 de octubre de 2011 14:04
  • Leandro, la tuya me pareció buena idea, pero cuando le pongo Delete al CommandName del LinkButton que defino en el TemplateField, sigue ejecutándome el por defecto, porque me dice que el ObjectDatasource no tiene definición para el DeleteMethod.

    Ya lo solucioné, le puse "eliminar" al CommandName así no me agarra el que es por defecto y ahora funciona.

     

    Gracias a todos!

    • Editado Josecanalla jueves, 6 de octubre de 2011 14:08
    jueves, 6 de octubre de 2011 14:07
  • Tengo el problema de que no puedo individualizar al "Usuario" de la fila en la que clickeo el LinkButton, ¿cómo puedo hacer? Cuando quiero convertir a Int32 el CommandArgument me da una excepción de que la cadena no tiene el formato correcto.
    jueves, 6 de octubre de 2011 14:12
  • del ultimo link que propuse valida el titulo

    1c- Usando el evento RowCommand

    alli esta la solucion


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 6 de octubre de 2011 14:14
  • Bien, de esa forma logré obtener el índice. Pero me gustaría obtener el valor que la fila tiene en su DataKeyNames, que lo tengo seteado en ID.
    jueves, 6 de octubre de 2011 14:20
  • pero entonces no has visto el ejemplo completo, porque con el indice se hace

    int id = Convert.ToInt32(gvPerson.DataKeys[index].Value);

    o sea usas el DataKeys


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Josecanalla jueves, 6 de octubre de 2011 14:28
    jueves, 6 de octubre de 2011 14:25
  • Ahora si, funciona. Muchas gracias.
    jueves, 6 de octubre de 2011 14:28