c# asp.net excel gridview templatefield

c# - ¿Cómo obtener valores de los campos de plantilla en GridView?



asp.net excel (6)

Esta es mi marca de GridView.

<Columns> <asp:TemplateField HeaderText="Customer Name"> <ItemTemplate> <asp:Label ID="lblname" runat="server" Text=''<%# DataBinder.Eval(Container.DataItem, "Customer.Name")%>''></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="PickUpPoint"> <ItemTemplate> <asp:Label ID="lblPickUpPoint" runat="server" Text=''<%# DataBinder.Eval(Container.DataItem, "Pickuppoint")%>''></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns>

Tengo un botón que almacena los valores en las celdas de la hoja de cálculo del objeto excel.

for (int i = 0; i < GridView2.Rows.Count; i++) { for (int j = 0; j < GridView2.Rows[i].Cells.Count; j++) { xlWorkSheet.Cells[i + 1, j + 1] = GridView2.Rows[i].Cells[j].Text; } }

¿Cómo obtengo los valores de GridView y los almacena en una hoja de trabajo, ya que GridView2.Rows[i].Cells[j] .Text devuelve una cadena vacía?


Te falta un elenco de tipo. Hazlo asi-

Label name = (Label)GridView2.Rows[i].Cells[j].FindControl("lblname"); xlWorkSheet.Cells[i + 1, j + 1] = name.Text;

Actualización: si puede asignar un nombre a sus etiquetas como Label0 y Label1, en el segundo ciclo de bucle-

for (int j = 0; j < GridView2.Rows[i].Cells.Count; j++) { Label xyz = (Label)GridView2.Rows[i].Cells[j].FindControl("Label"+j); xlWorkSheet.Cells[i + 1, j + 1] = xyz.Text; }

Para el texto del encabezado: string hText = GridView2.HeaderRow.Cells[your column number].Text;


use este tipo "Button btnledName = (Button) remitente;" Lo ayudará a proteger void btnledName_Click (object remitente, EventArgs e) {

Button btnledName = (Button)sender; GridViewRow Grow = (GridViewRow)btnledName.NamingContainer; Label lblname = new Label(); Label lblPickUpPoint= new Label(); lblname = (Label)Grow.FindControl("lblname"); lblPickUpPoint = (Label)Grow.FindControl("lblname"); #region if (lblname.Text.Length > 0) { //Add in your work sheet } #endregion }


{cell}.Text solo funcionará si no hay un control dentro de TemplateField . Ha agregado una etiqueta a su plantilla, por lo que primero necesita encontrar el control, enviar su objeto al control y acceder a las propiedades del control según sea necesario.

Si desea un enfoque más genérico, siempre puede hacer lo siguiente (eliminar el control de etiqueta y simplemente agregar el campo evaluado):

<Columns> <asp:TemplateField HeaderText="Customer Name"> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem, "Customer.Name")%> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="PickUpPoint"> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem, "Pickuppoint")%> </ItemTemplate> </asp:TemplateField> </Columns>

Cuando utiliza el código que utilizó inicialmente, el {cell}.Text ya no debería volverse vacío.


protected void Button1_Click(object sender, EventArgs e) { int i = 0; for (i = 0; i <= GvSchedule.Rows.Count - 1; i++) { if (((CheckBox)GvSchedule.Rows[i].FindControl("ChkIsService")).Checked) { string catName = ((Label)GvSchedule.Rows[i].FindControl("lblCatName")).Text; var subCatName = ((Label)GvSchedule.Rows[i].FindControl("lblSubCatName")).Text; } } }


Intenta usar este código, tuve un problema similar. Creo que este código es más dinámico y no tienes que encontrar el nombre de la etiqueta cada vez. Pero para mantener la correspondencia entre los controles y los controles de índice []:

for (int row = 1; row <= totalRows; row++) { for (int col = 0; col < totalCols; col++) { if (GridView1.Columns[col].Visible) { if (String.IsNullOrEmpty(GridView1.Rows[row - 1].Cells[col].Text)) { if (GridView1.Rows[row - 1].Cells[col].Controls[1].GetType().ToString().Contains("Label")) { Label LB = (Label)GridView1.Rows[row - 1].Cells[col].Controls[1]; workSheet.Cells[row + 1, col + 1].Value = LB.Text; } else if (GridView1.Rows[row - 1].Cells[col].Controls[1].GetType().ToString().Contains("LinkButton")) { LinkButton LB = (LinkButton)GridView1.Rows[row - 1].Cells[col].Controls[1]; workSheet.Cells[row + 1, col + 1].Value = LB.Text; } } else { workSheet.Cells[row + 1, col + 1].Value = GridView1.Rows[row - 1].Cells[col].Text; }


Para recuperar valores haz esto:

for (int i = 0; i < GridView2.Rows.Count; i++) { //extract the TextBox values Label lblname= (Label)GridView2.Rows[i].Cells[0].FindControl("lblname"); Label lblPickUpPoint= (Label)GridView2.Rows[i].Cells[0].FindControl("lblPickUpPoint"); //Do your excel binding here }