|
|
|
|
|
#1 -
09/07/2007 13:21:01
|
Reporta abuso
|
Link Permanente
|
|
Gridview de insercion
|
|
|
|
|
|
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
|
|
|
|
|
|
#2 -
18/07/2007 17:22:33
|
Reporta abuso
|
Link Permanente
|
|
RE: Gridview de insercion
|
|
|
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.
|
|
|
|
|
|
|
#3 -
17/07/2007 14:10:16
|
Reporta abuso
|
Link Permanente
|
|
RE: Gridview de insercion
|
|
|
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.
|
|
|
|
|
|
|
#4 -
13/07/2007 14:04:27
|
Reporta abuso
|
Link Permanente
|
|
RE: Gridview de insercion
|
|
|
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
|
|
|
|
|
|
|
#5 -
13/07/2007 8:45:53
|
Reporta abuso
|
Link Permanente
|
|
RE: Gridview de insercion
|
|
|
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
|
|
|
|
|
|
|
|