[ Foro de C# ]

ABM dinamico

04-Jul-2014 23:13
eze lan
3 Respuestas

Buenos dias

Dejo el codigo de mi ABM dinamico, el problema que tengo es en el metodo RowGrabarNuevo, que nunca encuentra los textbox que agregué en el metodo Button2_Click.

Por favor, hace 2 semanas me trabé con esto y no sé por qué entra siempre a la excepcion.

 
namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        const int cantcolumnas = 5;
        int columnainicial = 2;
        DataTable dt = new DataTable();
        Negocio1 neg = new Negocio1();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
 
 
                //DataColumn[]cantcolum=new DataColumn[cantcolumnas];
                //for(int k=1;k<cantcolumnas+1;k++)
                //    {
                //        cantcolum[k-1]= new DataColumn("Id"+Convert.ToString(k), typeof(string));
                //    }
                //dt.Columns.AddRange(cantcolum);
                //GridView1.DataSource = dt;  
                //GridView1.DataBind();
 
 
            }  
        }
        protected void RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
 
                // Se busca el Usuario por el legajo y se lo borra.
                GridView1.DataKeyNames = new string[] { "id_" + DropDownList1.SelectedValue };
                if (neg.Eliminar(DropDownList1.SelectedValue, GridView1.DataKeys[e.RowIndex].Value.ToString()))
                {
                    // Se recarga la grilla.
                    dt = neg.TraerABM(DropDownList1.SelectedValue);
 
 
                    GridView1.DataSource = dt;
                    GridView1.DataBind();
                }
 
 
 
        }
        protected void RowEditing(object sender, GridViewEditEventArgs e)
        {
            dt = neg.TraerABM(DropDownList1.SelectedValue);
            GridView1.DataKeyNames = new string[] { "id_" + DropDownList1.SelectedValue };
 
            GridView1.DataSource = dt;
            GridView1.EditIndex = e.NewEditIndex;
            GridView1.DataBind();
 
        }
        protected void RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
 
            GridViewRow row = GridView1.Rows[e.RowIndex];
 
            //TextBox txtFirstName = row.FindControl("nombre") as TextBox;
 
            dt = neg.TraerABM(DropDownList1.SelectedValue);
            int cantcolum =row.Cells.Count;
            int j = 0;
            int h = 0;
            string[] vector = new string[cantcolum - columnainicial + dt.Columns.Count];
            for (int I = 0; I < cantcolum - columnainicial; I++)
            { //inicio For 1
                    try
                    {
                        string t = row.Cells[I + columnainicial].Controls[0].GetType().ToString();
                        //comprobamos si es tipo CheckBox
                        if (t.Contains("CheckBox"))
                        {
                            if (((CheckBox)(row.Cells[I+columnainicial].Controls[0])).Checked)
                            {
                                vector[j] = dt.Columns[I+h].ColumnName;
                                j ++;
                                vector[j] = "True";
                                j++;
                            }
                            else
                            {
                                vector[j] = dt.Columns[I + h].ColumnName;
                                j++;
                                vector[j] = "False";
                                j++;
                            }
 
                        }
                        else if (t.Contains("TextBox"))
                        {
                            vector[j] = dt.Columns[I + h].ColumnName;
                            j++;
                            vector[j] = ((TextBox)(row.Cells[I + columnainicial].Controls[0])).Text;
                            j++;
                        }
                    }
                    catch (Exception ex)
                    {
 
                        vector[j] = dt.Columns[I + h].Caption;
                            j++;
                            vector[j] = row.Cells[I + columnainicial].Text;
                            j++;
                        //No se pudo capturar el tipo de dato
                    }
            }//Fin FOR 1
            RowCancelEditing(null, null);
            neg.Update(DropDownList1.SelectedValue, vector);
 
 
            //GridView1.DataBind();
        }
        protected void RowCancelEditing(object sender, GridViewCancelEditEventArgs e)
        {
            //Reset the edit index.
            GridView1.EditIndex = -1;
            //Bind data to the GridView control.
            GridView1.DataBind();
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            //Si elimino las columnas del formulario, el datasource lo hace bien
 
 
            dt = neg.TraerABM(DropDownList1.SelectedValue);
            //Session["Datos"] = dt;
            Session.Add("Tabla", dt);
            GridView1.DataSource = dt;
 
            GridView1.DataKeyNames = new string[] { "id_" + DropDownList1.SelectedValue };
            GridView1.DataBind;
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            dt = neg.TraerABM(DropDownList1.SelectedValue);
 
 
            GridView1.DataSource = dt;
            int h = dt.Columns.Count;
            GridView1.DataBind();
            int rowsCount = this.GridView1.Rows.Count;
            for (int j = 0; j < h; j++)
            {
 
                TextBox textBox = new TextBox();
                textBox.ID = "txtDynamicText" + j.ToString();
                textBox.Attributes.Add("runat", "server");
                GridView1.FooterRow.Cells[j + 2].Controls.Add(textBox);
 
            }
 
 
 
        }
        protected void RowGrabarNuevo(object sender, GridViewCommandEventArgs e)
        {
            if(e.CommandName.Equals("Grabar"))
            {
                dt = neg.TraerABM(DropDownList1.SelectedValue);
 
                int cantcolum = GridView1.FooterRow.Cells.Count;
                int j = 0;
                int h = 0;
                string[] vector = new string[cantcolum - columnainicial + dt.Columns.Count];
                //TextBox txtFirstName = row.FindControl("nombre") as TextBox;
 
 
 
 
                for (int I = 0; I < cantcolum - columnainicial; I++)
                { //inicio For 1
                    try
                    {
 
                        string t =  GridView1.FooterRow.Cells[I + columnainicial].Controls[0].GetType().ToString();
 
                        //comprobamos si es tipo CheckBox
                        if (t.Contains("CheckBox"))
                        {
                            if (((CheckBox)(GridView1.FooterRow.Cells[I + columnainicial].Controls[0])).Checked)
                            {
                                vector[j] = dt.Columns[I + h].Caption;
                                j++;
                                vector[j] = "True";
                                j++;
                            }
                            else
                            {
                                vector[j] = dt.Columns[I + h].ColumnName;
                                j++;
                                vector[j] = "False";
                                j++;
                            }
 
                        }
                        else if (t.Contains("TextBox"))
                        {
                            vector[j] = dt.Columns[I + h].ColumnName;
                            j++;
                            vector[j] = ((TextBox)(GridView1.FooterRow.Cells[I + columnainicial].Controls[0])).Text;
                            j++;
                        }
                    }
                    catch (Exception ex)
                    {
 
                        vector[j] = dt.Columns[I + h].Caption;
                        j++;
                        vector[j] = GridView1.FooterRow.Cells[I + columnainicial].Text;
                        j++;
                        //No se pudo capturar el tipo de dato
                    }
                }//Fin FOR 1
            }
        }
 
 
  }
}
 


Muchas gracias a todos por responder


05-Jul-2014 10:38
Nacho Cabanes (+31)

Ayudaría saber el mensaje de error que obtienes, porque estás atrapando todas las excepciones en un único "catch", de modo que cualquier cosa te puede llevar hasta allí, desde un fichero inexistente hasta un desbordamiento de una estructura de datos o una división entre cero.

Los mensajes de error suelen ser bastante detallados. Por eso, puedes incluso eliminar el try-catch y dejar que Visual Studio te muestre la "pila de llamadas" que provocó el fallo.

Si no, al menos pide que te muestre el mensaje de error asociado a la excepción ("ex.Message").


05-Jul-2014 15:00
eze lan

Primero que nada de agradezco enormemente por responder.
Perdón, me olvide de poner el error.
Es el siguiente: "El argumento especificado está fuera del intervalo de valores válidos.
Nombre del parámetro: index"


06-Jul-2014 19:03
Nacho Cabanes (+31)

Suena a que estás desbordando un array o una lista,  supongo que la variable llamada "vector",  pero sin saber la línea en que da el error y sin tener el fuente completo para poder probarlo yo, no puedo decirte más, porque tampoco veo ningún parámetro llamado "index".






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)