c#
  • asp.net
  • excel
  • gridview
  • templatefield
  • 2012-12-10 6 views 6 likes 
    6

    Dies ist mein Markup von GridView.Wie bekomme ich Werte aus Vorlagenfeldern in 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> 
    

    Ich habe eine Schaltfläche, die die Werte in den Arbeitsblattzellen von Excel-Objekt speichert.

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

    Wie erhalte ich die Werte von Gridview und speichern sie in einem Arbeitsblatt, wie die GridView2.Rows[i].Cells[j] .Text leeren String zurückgibt.

    Antwort

    7

    Sie eine Art Guss fehlen. Machen Sie es wie this-

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

    Update- Wenn Sie Ihre Etiketten wie Label0 und Label1, dann in der zweiten für Loop-

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

    Für Header-Namen können text- string hText = GridView2.HeaderRow.Cells[your column number].Text;

    +0

    okay ... aber, wie es geht für andere Kontrollen ... wenn die Schleife das zweite tym ... wie kann ich das Etikett auf "lblPickUpPoint" .... Dank – Kulkarni

    +0

    funktioniert wie ein Charme Mann .... danke ...... Bearbeiten: Jetzt bekomme ich alle Daten in der Gridview .. Wie kann ich den 'TemplateField HeaderText' auch in das Arbeitsblatt bekommen ... ??? danke im Voraus ... – Kulkarni

    +0

    Wie kann ich 'TemplateField HeaderText' auch in das Arbeitsblatt bekommen ... ?? – Kulkarni

    3

    zum Abrufen von Werten wie folgt vorgehen:

    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 
    } 
    
    +0

    bekam ich die Werte aus den Feldern, wie soll ich es binden an das Arbeitsblatt ... als 'xlWorkSheet.Cells [i + 1, j + 1] = GridView2.Rows [i] .Zellen [j] .Text; ' Was muss ich tun, wenn ich sie in Reihenfolge bringen muss ... edit: Brauche ich die zweite? für die Schleife .. ??? – Kulkarni

    +1

    Wenn Sie Zeile für Zeile in Excel schreiben möchten, versuchen Sie Folgendes: http: //www.clear-lines.com/blog/post/Write-data-to-an-Excel-worksheet-with-C-fast.aspx Wenn Sie vollständigen Gridview-Export möchten, versuchen Sie Folgendes: http://www.codeproject.com/Tips/477436/Export-Gridview-Data-to-Excel-in-ASP-NET – sajanyamaha

    0

    {cell}.Text funktioniert nur, wenn innerhalb der TemplateField kein Steuerelement vorhanden ist. Sie haben Ihrer Vorlage eine Beschriftung hinzugefügt. Aus diesem Grund müssen Sie zuerst das Steuerelement suchen, Ihr Objekt in das Steuerelement umsetzen und nach Bedarf auf die Eigenschaften des Steuerelements zugreifen.

    Wenn Sie einen allgemeineren Ansatz wollen können Sie immer die folgende (das Label-Steuerelement entfernen und einfach das ausgewerteten Feld hinzufügen) tun:

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

    Wenn Sie den Code, den Sie zunächst verwendet, die {cell}.Text hinfort längere Rückgabe leer.

    +0

    Entschuldigung, ich hätte schwören können, dass das in einem Stadium funktioniert hat, aber ich muss mich schrecklich geirrt haben. Ich denke, die beste Wette ist, ein BoundField zu verwenden, wenn Sie mit Ihren Daten nichts Brauchbares machen. Sonst könnte man '((Label) gvTest.Rows [i] .Cells [j] .Controls [1]) verwenden. Text' Nach meinem besten Wissen befindet sich das Label-Steuerelement immer auf dem Index 1, vorausgesetzt, Sie haben keine zusätzlichen Steuerelemente, die vor dem Etikett in Ihrer Vorlage hinzugefügt wurden. – cbillowes

    -1

    Verwendung dieser Typ "Button btnledName = (Button) sender;" Es ll hilft Ihnen Leere btnledName_Click (object sender, EventArgs e) geschützt {

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

    Ich habe versucht, in meinem Projekt Addbutton Click Event ......... es funktioniert gut –

    1

    Versuchen Sie diesen Code verwenden, Ich hatte ein ähnliches Problem. Ich denke, dass dieser Code dynamischer ist und Sie nicht jedes Mal den Namen des Labels finden müssen. Aber die Übereinstimmung zwischen den Kontrollen zu halten und der Index Kontrollen []:

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