web-dev-qa-db-fra.com

Comment obtenir des valeurs à partir de champs de modèle dans GridView?

Ceci est mon balisage 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>

J'ai un bouton qui stocke les valeurs dans les cellules de la feuille de calcul de l'objet 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;
   }
}

Comment obtenir les valeurs de GridView et les stocker dans une feuille de calcul, en tant que GridView2.Rows[i].Cells[j]. Text renvoie une chaîne vide.

7
Sandeep

Il vous manque un casting de type. Fais-le comme ça-

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

Update- Si vous pouvez nommer vos étiquettes comme Label0 et Label1, puis dans la seconde pour boucle-

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;
  }

Pour le texte d'en-tête - string hText = GridView2.HeaderRow.Cells[your column number].Text;

9
Cdeez

Pour récupérer des valeurs, procédez comme suit: 

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
}
3
sajanyamaha

{cell}.Text ne fonctionnera que s'il n'y a pas de contrôle dans la TemplateField. Vous avez ajouté une étiquette à votre modèle. C'est pourquoi vous devez tout d'abord rechercher le contrôle, transtyper votre objet sur le contrôle et accéder aux propriétés du contrôle en fonction des besoins.

Si vous souhaitez une approche plus générique, vous pouvez toujours procéder comme suit (supprimer le contrôle d'étiquette et simplement ajouter le champ évalué): 

<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>

Lorsque vous utilisez le code que vous avez initialement utilisé, le {cell}.Text ne devrait plus être vide.

1
cbillowes

Essayez d'utiliser ce code, j'ai eu un problème similaire. Je pense que ce code est plus dynamique et qu'il n'est pas nécessaire de trouver le nom de l'étiquette à chaque fois. Mais pour conserver la correspondance entre les contrôles Et l'index Controls []:

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;
            }
1
Nitzan Malichi
 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;
            }
        }
     }
0
Ayaat Shifa