Mensaje dentro de Principiantes

Gridview de insercion

Responder 
#1 - 09/07/2007 13:21:01 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
0 post en este tema
188 posts en principiantes
194 posts en todos los foros
Gridview de insercion

Responder Citar
Hola amigos,

Necesito crear un gridview para insertar datos de los pasajeros. Mi problema en este momento es que tengo el gridview creado mediante item templates (no se si deberia usar estas templates o otras), pero cuando ejecuto la aplicacion no me aparece el gridview por tanto no puedo insertar los datos de ningun pasajero. Lo que quiero es que aparezca la primera fila en blanco del gridview para introducir los datos de un pasajero y cuando haya llenado esa fila poder agregar otra fila en blanco para introducir los datos de otro pasajero. Os dejo el codigo del gridview para que veais como he creado los campos de insercion:


            <asp:GridView ID="GVPassengers" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:ButtonField CommandName="Insert" Text="Add" />
                    <asp:TemplateField HeaderText="Lead">
                        <ItemStyle HorizontalAlign="Center" />
                        <InsertItemTemplate>
                            <asp:RadioButton ID="RdoLead" runat="server" TabIndex="11" />
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Init">
                        <InsertItemTemplate>
                            <asp:TextBox ID="TxtInit" runat="server" TabIndex="12"></asp:TextBox>
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Surname">
                        <InsertItemTemplate>
                            <asp:TextBox ID="TxtSurname" runat="server" TabIndex="13"></asp:TextBox>
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Age *">
                        <InsertItemTemplate>
                            <asp:TextBox ID="TxtAge" runat="server" TabIndex="14"></asp:TextBox>
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="P.T. Card No Staff Travel">
                        <InsertItemTemplate>
                            <asp:TextBox ID="TxtStaff" runat="server" TabIndex="15"></asp:TextBox>
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Outward">
                        <ItemStyle HorizontalAlign="Center" />
                        <InsertItemTemplate>
                            <asp:CheckBox ID="CBOutward" runat="server" TabIndex="16" />
                        </InsertItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Return">
                        <ItemStyle HorizontalAlign="Center" />
                        <InsertItemTemplate>
                            <asp:CheckBox ID="CBReturn" runat="server" TabIndex="17" />
                        </InsertItemTemplate>
                    </asp:TemplateField>
                </Columns>                
            </asp:GridView>


Gracias por adelantado
Volver arriba

Respuestas
Mostrar de en 15
#2 - 18/06/2010 1:07:12 Reporta abuso | Link Permanente
Fabricio Leon
Usuario no registrado
RE: Gridview de insercion

Responder Citar
En mi blog, tengo informacion que posiblemente les de mas ideas o les ayude de alguna manera.

http://fabricioleon.wordpress.com

Saludos...
Volver arriba

#3 - 24/10/2008 17:00:24 Reporta abuso | Link Permanente
Anonimo
Usuario no registrado
RE: Gridview de insercion

Responder Citar
Hola... mira estoy tratando de hacer algo similar, pero no logro guardar la tabla en el viewstate  para luego cargarla nuevamente en el page_preload
Si me puedes ayudar te lo agradeceria mucho.
Que estes bn.
Volver arriba

#4 - 18/07/2007 17:22:33 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
1 post en este tema
188 posts en principiantes
194 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola subgurim, gracias una vez mas por responder.
La verdad es que no tengo declarada ninguna clase con la estructura de pasajero (mal hecho, me hubiera ahorrado mucho tiempo). El tema es que ya consigo añadir mis filas dinamicamente y puedo guardar el estado de las mismas en el viewstate. Cuando se ve la solucion parece sencilla, pero hasta que no llegas a ella no es tan obvia. Voy a contar como lo he hecho por si a alguien le viene bien. Lo he conseguido de la siguiente forma:

Aqui lo que hago es añadir una fila nueva y luego guardo el estado de la tabla en el ViewState.
Protected Sub BtnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnAdd.Click
        AddNewRow(TblPassengers)
        SaveTblPassengers()
End Sub

Aqui me leo el ViewState para meterlo en la tabla y recuperar la informacion que teniamos en ella.
Protected Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreLoad
       Bucles de lectura (Algo larguillos, por eso no los pongo, pero si se necesitan pedirlos)
End Sub

La idea del codigo es que veais cual es la secuencia para llenar y recuperar el ViewState.

Ahora, como no podia ser de otra forma, tengo la siguiente duda:

Al crear los controles dinamicamente no puedo crear procedimientos que manejen sus eventos, ya que al no estar declarados estaticamente no se reconocen. Es decir, yo dinamicamente me creo un control llamado "RdoLeadtbl3", pero no puedo definir en mi archivo .aspx.vb un procedimiento que sea:

Protected Sub RdoLeadtbl3_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RdoLeadtbl3.CheckedChanged

Esto me dice que no se puede compilar, porque no esta definido RdoLeadtbl3 (recordad que lo defino en ejecucion). Por tanto mi problema es: yo voy añadiendo pasajeros a la tabla. De estos pasajeros solo uno puede ser principal. Esto obviamente lo controlo con unos RadioButton (no puede ser RadioButtonList porque quiero un boton por fila y no una lista de botones por fila). El problema que me encuentro es que no se como capturar el evento CheckedChanged de estos RadioButton para cambiar el pasajero principal segun se seleccione uno u otro. Actualmente me pone el puntito en todos  los que pinches y lo que deberia de hacer es cambiarlo. Por tanto la pregunta es:

¿Como se capturan los evetos de los controles creados dinamicamente?

Agradezco cualquier ayuda.

Un saludo.

Volver arriba

#5 - 17/07/2007 14:10:16 Reporta abuso | Link Permanente
subgurim
Fecha de registro: 01/12/2006
1 post en este tema
542 posts en principiantes
1777 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola Javier,

veo que sigues avanzando muchísimo!!

El truco aquí no es meter el PlaceHolder en el Viewstate. En el ViewState debes insertar la fuente de datos del PlaceHolder.

Por ejemplo, supongo que tienes una clase que define lo que estás insertando (pongamos el ejemplo de la clase "Persona" con las propiedades "Nombre" y "Apellidos").

Pues el ViewState debería contener un listado genérico, que inserte un elemento cada vez que realices una inserción, y que sirva como DataSource de tu Table.

A mí me gusta ponerlos dentro de una propieda de la propia página en la que estás:

private List<Persona> personas
{
    get
    {
          if (ViewState["personas"] == null)
                ViewState["personas"]  = new List<Persona>();

          return (List<Persona>)ViewState["personas"] ;
    }
    set
    {
       ViewState["personas"]  = value;
    }
}


Trabaja desde aquí a ver qué concluyes!!

Saludos.

Volver arriba

#6 - 13/07/2007 14:04:27 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
1 post en este tema
188 posts en principiantes
194 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola de nuevo subgurim, muchas gracias por la respuesta. Ya me explicaras que es lo que no te gusta de asp:table, es muy comodo para dibujar tablas, Ahora lo estoy haciendo con el "placeholder" (como me recomendaste) y no veas la que he montado para dar la apariencia de tabla. En cualquier caso, como tu me dices, necesito guardar el estado de la pagina (numero de filas añadidas) en el viewstate. Lo que yo he intentado es:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    Me.ViewState.Add("Tabla", PHPassengers)
End Sub

Pero eso me da el siguiente error:

Server Error in '/Concession Form' Application.

Type 'System.Web.UI.WebControls.PlaceHolder' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.Serialization.SerializationException: Type 'System.Web.UI.WebControls.PlaceHolder' in Assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.


Por tanto, he intentado meter el placeholder como variable de session, para recuperar los controles desde ahi, pero con esto ni siquiera me añade la fila 2 que me añadia antes.

Me podrias decir donde buscar informacion concreta sobre lo que yo necesito hacer con ViewState. He intentado en MSDN pero salen muchisimos resultados. Si sabes de algun articulo me facilitarias un poquito la busqueda.

Tambien he probado metiendo un dropdownlist para seleccionar el numero de pasajeros (tipo las paginas de compañias aereas), pero me ocurre lo mismo, es decir, la tabla s eme crea bien, pero cuando intento enviar los datos la tabla esta vacia y no recupera lo que se escribio en el navegador. Supongo que esto tendra la misma solucion que el botoncito de añadir (variables viewstate).

Muchas gracias de nuevo y a ver si soluciono este tema que llevo casi una semana con el.

Espero respuetas, gracias.


EDITADO 13/07/2007 17:27:48: Nueva prueba con dropdownlist
Volver arriba

#7 - 13/07/2007 8:45:53 Reporta abuso | Link Permanente
subgurim
Fecha de registro: 01/12/2006
1 post en este tema
542 posts en principiantes
1777 posts en todos los foros
RE: Gridview de insercion

Responder Citar
buff... vaya un post enorme!!!

Lo primero de todo: yo no usaría asp:table --> lo odio!! es el control de ASP.NET que menos me gusta!!

Lo normal para estos casos es poner un PlaceHolder al que añadirle directamente los TextBoxes (o lo que sea):

TextBox txt1 = new TextBox();
// Inicializar propiedades del TextBox
PlaceHolder1.Controls.Add(txt1);


Al PlaceHolder le puedes añadir lo que quieras, y según parece, a ti te conviene añadirle TextBox's y Literal's


Por otra parte, en casos como el tuyo, lo mejor es guardar todo en una variable "ViewState", si no te ocurrirá lo que te viene ocurriendo: al hacer un postback te desaparece lo último que has hecho

Saludos
Volver arriba

#8 - 12/07/2007 17:45:27 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
1 post en este tema
188 posts en principiantes
194 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola subgurim, muchas gracias por la respuesa, al final utilizare textbox si no me queda mas remedio. Ahora estoy probando a crearme plantillas en tiempo de ejecucion. He probado dos cosas:

1. Utilizar asp:table. Esta casi me funciona, pero el unico problema que tengo es: yo defino de primeras (estaticamente) la cabecera, la primera fila y el pie. En la cabecera van los titulos de las columnas, en la fila tengo los text box de insercion de datos y en el pie el boton para añadir otra fila de insercion de datos. Cuando doy al boton creo una nueva fila en blanco y la inserto despues de la ultima fila de insercion, es decir, la nueva es la fila de insercion dos. Hasta aqui todo bien, el problema viene cuando le digo que inserte la fila de insercion tres. Cuando intento hacer esa operacion me borra la fila dos y me pone una nueva fila dos vacia. Para solucionar esto he intentado copiar la tabla original en otra tabla auxiliar de diversas maneras para hacer los cambios en la auxiliar y luego hacer la asignacion de la original a la auxiliar. Aqui dejo los intentos:

      - antes del load (page_preload)
           Dim aux as New Table
           aux = original (esto creo que lo que hace es olvidarse del puntero creado con el new y ahora apunta a la
                                 tabla origen por tanto como si no hiciera nada)


      - antes del init (page_preinit)
           Dim aux as New Table
           aux = original
(esto creo que lo que hace es olvidarse del puntero creado con el new y ahora apunta a la
                                 tabla origen por tanto como si no hiciera nada)


      - durante la insercion de la fila, donde me vuelco toda la informacion de la tabla original a una tabla auxiliar,              creo una fila en blanco en la tabla auxiliar y luego asigno la auxiliar a la original:
             Procedimiento que crea la cabecera de la tabla (fila por fila, celda por celda, control por control) = 
                    CreateHeader (ByRef tabla as Table)
             Procedimiento que copia los valores de los controles (no los controles) de la tabla original a la auxiliar =
                   CopyData (ByRef aux as Table, ByVal origen as Table)
             Procedimiento que me crea el pie de tabla =
                   CreateFooter
(ByRef tabla as Table)
             Procedimiento que me serializa el proceso =
                   Protected Sub BtnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _ BtnAdd.Click
                        Dim aux As New Table
                        CreateHeader(aux)
                        CopyData(origen, aux)
                        AddNewRow(aux)
                        CreateFooter(aux)
                        origen.Dispose()
                        origen = aux (aqui se supone que cambia el puntero que hace referencia a la tabla vieja por uno
                                             que hace referencia a la tabla nueva con una fila mas)

                   End Sub

            
Pues esto tan sencillo "aparentemente", no funciona debido a que cuando debuggeas ves que la primera iteracion si que añade una fila, pero en la segunda no (no es que no lo añada es que no cuenta con la fila que hemos añadido antes). Por tanto el numero de filas por iteraciones es: (Tenemos en cuenta que la tabla esta vacia en la pagina .aspx")

Inicio del programa -> 0 filas
Carga de pagina .aspx -> 3 filas (cabecera, fila 1 y pie)
Añadimos una fila -> 4 filas (cabecera, fila 1, fila 2 y pie)
Añadimo otra fila -> 4 filas (cabecera, fila 1, fila 2 y pie) En esta iteracion cuando entra al procedimiento
                                                                                      "
BtnAdd_Click" la tabla original tiene solo 3 filas en
                                                                                      lugar de las 4 que deberia. Por tanto al final te añade una
                                                                                      pero te quita otra.

Esto con un asp:table.

2. Estoy probando con plantillas (templates) dinamicas, pero no he profundizado tanto. La idea es que puedes generar las plantillas de los grids, forms o details dinamicamente. Pero en el articulo que he visto has de tener un datasource que te de la informacion. Yo he probado a hacerlo con un datasource, pero si no tiene informacion, como seria mi caso con el primer pasajero, no se ve el template vacio y por tanto no puedes introducir datos. Ademas, no he mirado todas las plantillas editables, pero creo que son solo las de recuperacion y edicion de datos, por tanto no me valdria porque yo quiero insertar. De todas formas en cuanto tenga mas idea de como funcionan si veo qeu se puede y no me sale ya preguntare.

En prevision de que no pueda usar tablas ni nada y me tenga que quedar con los textbox, sabes como generar los textbox (en base a un criterio, en mi caso numero de pasajeros) en tiempo de ejecucion y meterlos en la pagina .aspx para usarlos.

PD: Perdon por el mega post, pero tanto probar es lo que tiene. XDDD

Muchas gracias una vez mas. Espero respuestas.
Volver arriba

#9 - 12/07/2007 12:12:06 Reporta abuso | Link Permanente
subgurim
Fecha de registro: 01/12/2006
1 post en este tema
542 posts en principiantes
1777 posts en todos los foros
RE: Gridview de insercion

Responder Citar
bufff, la verdad es que es complicado de hacer... y obviamente complicado de explicar

Vamos a cambiar de tercio: no uses un formview, usa textboxes y buttons a tu antojo.
Y cuando hagas clic sobre el button no insertes en una base de datos: mete los datos en el ViewState (un listado genérico de tu tipo de datos)

Y cuando quieras meter todos los datos en la BBDD, lees uno a uno el listado y los vas insertando.

esto son sólo las líneas generales... aquí entra ya tu imaginación y tu conocimiento de la aplicación...
Volver arriba

#10 - 11/07/2007 16:55:45 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
1 post en este tema
188 posts en principiantes
194 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Y a mi tambien me parece perfecto chachondo . Fuera de bromas, he creado mi FormView con layout de GridView. Tengo una cabecera, una primera fila de insercion en el ItemInsertTemplate y un pie con el boton. Hasta aqui todo bien. Ahora el problema viene cuando lleno la primera fila y, sin guardar esos datos en la BD, tengo que crear una nueva fila en blanco por debajo de la anterior y por encima del pie. Ahi esta el problema, ya que solo he logrado meter una fila, por debajo del pie y previa insercion de la otra fila en la BD. Como hago para crear filas dinamicamente, situarlas en el formview y que no se me grabe nada a la BD hasta que yo no le diga que lo haga

Saludos y gracias de nuevo.
Volver arriba

#11 - 11/07/2007 14:24:13 Reporta abuso | Link Permanente
subgurim
Fecha de registro: 01/12/2006
1 post en este tema
542 posts en principiantes
1777 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola,

me parece perfecto.
sigo recomendando que uses el formview y que, mediante estilos, lo mimetices con el gridview
Volver arriba

#12 - 10/07/2007 10:53:46 Reporta abuso | Link Permanente
Javier Santamaria Hombre
Fecha de registro: 02/05/2007
1 post en este tema
188 posts en principiantes
194 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola subgurim, gracias por responder. El problema es que me piden que use esa estructura. Es decir tiene que quedar algo asi:

 

Campo 1

Campo 2

Campo 3

Campo 4

 

Info

Info

Info

Info

Añadir (boton)

(Vacio)

(Vacio)

(Vacio)

(Vacio)


Cuando de a añadir se me tiene que posicionar el cursor en el Campo 1 de la siguiente fila (siguiente pasajero).

De esta forma se ven todos los pasajeros a la vez.

Gracias de nuevo

Volver arriba

#13 - 10/07/2007 9:29:22 Reporta abuso | Link Permanente
subgurim
Fecha de registro: 01/12/2006
1 post en este tema
542 posts en principiantes
1777 posts en todos los foros
RE: Gridview de insercion

Responder Citar
Hola,

personalmente te recomiendo que uses un formview para insertar datos, y el gridview para mostrarlos.
Volver arriba
Mostrar de en 15

Hospedado en domitienda