2011-10-06 21 views
5

Disculpa el código anterior. ¿Alguien podría ayudar? Tengo un gridview GridView1 que está poblada en PageLoad() mediante la importación de hoja de cálculo de Excel que tiene tres columnas:No se pueden obtener los valores de los cuadros de texto en templateField dentro de gridview

  1. Fecha
  2. clientes
  3. PayingBookNoOrDD

La hoja tiene cinco filas. Los usuarios pueden editar los datos en cuadros de texto en la página (marcado a continuación). Después de la edición, cuando el usuario hace clic en el botón Enviar, necesito obtener estos nuevos valores de todos los cuadros de texto y actualizar la misma hoja de Excel desde donde se llenó el GridView.

Creé tres matrices de cadenas: dateArray, custArray y payingInBookArray para almacenar estos valores nuevos. Pero cuando ejecuto la aplicación, las tres matrices están vacías.

de marcado:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" DataKeyNames="Date,Customers,PayingInBookNoOrDD" > 
    <Columns> 
    <asp:TemplateField> 
     <HeaderTemplate>Date</HeaderTemplate> 
     <ItemTemplate> 
      <asp:TextBox runat="server" ID="txtDate" Text='<%# Bind("Date") %>'></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField> 
     <HeaderTemplate>Customers</HeaderTemplate> 
     <ItemTemplate> 
      <asp:TextBox runat="server" ID="txtCustomers" Text='<%# Bind("Customers") %>'></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField> 
    <asp:TemplateField> 
     <HeaderTemplate>PayingInBookNoOrDD</HeaderTemplate> 
     <ItemTemplate> 
      <asp:TextBox runat="server" ID="txtPayingInBookNoOrDD" Text='<%# Bind("PayingInBookNoOrDD") %>'></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

<asp:Button ID="txtSubmit" runat="server" Text="Submit" onclick="txtSubmit_Click" /> 

de código subyacente:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string selectQuery = "SELECT * FROM [Month1$B2:D5]"; 
    OleDbConnection conn = new OleDbConnection(connString); 

    conn.Open(); 

    OleDbDataAdapter da = new OleDbDataAdapter(selectQuery, conn); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 

    GridView1.DataSource = ds; 
    GridView1.DataBind(); 

    conn.Close(); 
    da.Dispose(); 
    conn.Dispose(); 
} 

protected void txtSubmit_Click(object sender, EventArgs e) 
{ 
    IList<string> DateArray = new List<string>(); 
    IList<string> custArray = new List<string>(); 
    IList<string> payInBookArray = new List<string>(); 

    foreach (GridViewRow gr in GridView1.Rows) 
    { 
     TextBox lblDate = (TextBox)gr.Cells[0].FindControl("txtDate"); 
     DateArray.Add(lblDate.Text); 

     TextBox lblCustomers = (TextBox)gr.Cells[1].FindControl("txtCustomers"); 
     custArray.Add(lblCustomers.Text); 

     TextBox lblPayInBookNo = (TextBox)gr.Cells[2].FindControl("txtPayingInBookNoOrDD"); 
     payInBookArray.Add(lblPayInBookNo.Text); 
    } 

    ExportToExcel(DateArray.ToArray(), custArray.ToArray(), payInBookArray.ToArray()); 

} 

Por favor, hágamelo saber si alguien tiene una solución.

Gracias.

+0

Por favor, limpie sus ejemplos de código ... demasiado para editar – CAbbott

+0

Hola CAbbott, lo siento, soy nuevo en este sitio. Traté de editar la pregunta pero se volvió aún más desordenado. Por favor, dame unos minutos y lo arreglaré. – Amol

+0

No llames a tus botones 'txtSubmit' o cualquier cosa que sea anterior a' txt' si realmente es un botón 'btn', puede ser muy engañoso. También debe envolver su objeto de conexión utilizando la instrucción 'using', de esa manera no tiene que llamar' .dispose() 'explícitamente. – JonH

Respuesta

0

Agregue una verificación de devolución de datos en su evento Page_Load. No puedo ver nada incorrecto con tu código btn_Submit.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!this.IsPostBack){ 
     string selectQuery = "SELECT * FROM [Month1$B2:D5]"; 
     OleDbConnection conn = new OleDbConnection(connString); 
     conn.Open(); 
     OleDbDataAdapter da = new OleDbDataAdapter(selectQuery, conn); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     GridView1.DataSource = ds; 
     GridView1.DataBind(); 
     conn.Close(); 
     da.Dispose(); 
     conn.Dispose(); 
    } 
} 
0

Personalmente, me gustaría cambiar su función txtSubmit_Click a esto:

protected void txtSubmit_Click(object sender, EventArgs e) 
{ 
    IList<string> DateArray = new List<string>(); 
    IList<string> custArray = new List<string>(); 
    IList<string> payInBookArray = new List<string>(); 

    foreach (GridViewRow gr in GridView1.Rows) 
    { 
     TextBox lblDate = (TextBox)gr.FindControl("txtDate"); 
     DateArray.Add(lblDate.Text); 

     TextBox lblCustomers = (TextBox)gr.FindControl("txtCustomers"); 
     custArray.Add(lblCustomers.Text); 

     TextBox lblPayInBookNo = (TextBox)gr.FindControl("txtPayingInBookNoOrDD"); 
     payInBookArray.Add(lblPayInBookNo.Text); 
    } 

    ExportToExcel(DateArray.ToArray(), custArray.ToArray(), payInBookArray.ToArray()); 

} 

Siempre he tenido problemas al tratar de acceder directamente a los valores de la colección .Cells. ¿Qué sucede cuando llamas al .FindControl en la fila misma?

Como han dicho otros, vale la pena pensar en nuevos nombres para sus campos HTML y sus variables. Parece trivial ahora tener DateArray de tipo IList, pero me lanzó brevemente un ciclo para ver DateArray.ToArray(). Los convenios de nomenclatura y otros pequeños cambios en el código fuente no le tomarán mucho tiempo para arreglarlo ahora, pero le ahorrarán mucho tiempo más tarde cuando tenga que volver a visitar este código después de semanas o meses de trabajar en otros proyectos.

0
Protected Sub txtNombres_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
     Session("FiltroNombres") = DirectCast(sender, TextBox).Text 

End Sub 
Cuestiones relacionadas