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
}