2016-07-28 10 views
0

Ich verwende Entity Framework, um Daten an eine GridView zu binden. Ich muss dann in der Lage sein, diese in eine PDF zu exportieren, wenn der Benutzer es benötigt. Ich habe jedoch ein Problem festgestellt - die Spaltenüberschriften erscheinen gut, aber jede Zeile danach ist leer. Ich habe einen Haltepunkt platziert und festgestellt, dass dies der Fall ist, weil der Text der GridViewRow-Zellen leer ist. Es sind jedoch eindeutig Daten in der GridView. Warum könnte das passieren?Konvertieren von GridView in DataTable - Zelle Text leer

Die aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="all.aspx.cs" Inherits="Ticket_System.reports.all" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:GridView ID="allTicketGrid" AutoGenerateColumns="false" runat="server" SortedDescendingHeaderStyle-VerticalAlign="NotSet" Enabled="False"> 
     <Columns> 
      <asp:TemplateField HeaderText="Ticket"> 
       <ItemTemplate> 
       <asp:Label ID="ticketLabel" runat="server" Text='<%# Bind("TICKET_ID") + Bind("STATUS_TYPE.DESCRIPTION") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
           <asp:TemplateField HeaderText="Property"> 
                <ItemTemplate > 
       <asp:label runat="server" id="propLabel" text='<%# Bind("propName") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 
        <asp:TemplateField HeaderText="Item Description"> 
       <ItemTemplate> 
       <asp:label runat="server" id="itemDescriptionLabel" text='<%# Bind("itemViewField") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 
         <asp:TemplateField HeaderText="Opening Notes"> 
       <ItemTemplate > 
       <asp:label runat="server" id="propLabel" text='<%# Bind("OPEN_STATUS.NOTES") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField>  
          <asp:TemplateField HeaderText="Opened On"> 
       <ItemTemplate > 
       <asp:label runat="server" id="openDateLabel" text='<%# Bind("OPEN_STATUS.UPDATED_DATE") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 
          <asp:TemplateField HeaderText="Opened By"> 
       <ItemTemplate > 
       <asp:label runat="server" id="openUserLabel" text='<%# Bind("OPEN_STATUS.endUser") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField>     
       <asp:TemplateField HeaderText="Last Updated"> 
       <ItemTemplate > 
       <asp:label runat="server" id="lastUpdateLabel" text='<%# Bind("LATEST_STATUS.UPDATED_DATE") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText="Last Updated By"> 
       <ItemTemplate > 
       <asp:label runat="server" id="lastUserLabel" text='<%# Bind("LATEST_STATUS.END_USER.FIRST_NAME") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 
        <asp:TemplateField HeaderText="Latest Notes"> 
       <ItemTemplate > 
       <asp:label runat="server" id="lastCommentLabel" text='<%# Bind("LATEST_STATUS.NOTES") %>'></asp:label></label> 
        </ItemTemplate> 
      </asp:TemplateField> 

     </Columns> 
    </asp:GridView> 
    <asp:Button Text="Export to PDF" ID="exportReportButton" OnClick="exportReport" runat="server" /> 
</asp:Content> 

und die cs

public partial class all : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

      if (!IsPostBack) 
      { 
       using (ticketModel dbContext = new ticketModel()) 
       { 
        allTicketGrid.DataSource = dbContext.TICKETs.ToList(); 
        allTicketGrid.DataBind(); 
       } 
      } 
     } 

     protected void exportReport(object sender, EventArgs e) 
     { 
      DataTable dt = new DataTable(); 

      for (int i = 0; i < allTicketGrid.Columns.Count; i++) 
      { 
       dt.Columns.Add(allTicketGrid.Columns[i].HeaderText); 
      } 
      foreach (GridViewRow rowView in allTicketGrid.Rows) 
      { 
       DataRow dr = dt.NewRow(); 

       for (int i = 0; i < rowView.Cells.Count; i++) 
       { 

        dr[i] = rowView.Cells[i].Text; 
       } 
       dt.Rows.Add(dr); 

      } 

       Document doc = pdfWorker.readyDocument(); 
      pdfWorker.createTable(doc, dt); 
      pdfWorker.savePDF(doc, "C:/Users/Khandokar/Documents/Test.pdf"); 
      } 

     } 

     } 

Das Problem bei dieser Linie ist dr[i] = rowView.Cells[i].Text; die rowView.Cells Text Eigenschaft ist eine leere Zeichenfolge. Nicht nur die erste Zeile oder zwei (der Header), sondern alle.

Thanks so much!

Antwort

1

Vielleicht liegt es daran, dass Sie Asp: Label-Steuerelemente in Zellen und nicht einen Text (von einem BoundField).

Versuchen Sie, Ihre Kontrollen wie im folgenden Beispiel für Ticket-Wert zu finden:

var myTicketLabel = (Label) rowView.FindControl("ticketLabel");

+1

Sieht aus wie Sie den Nagel auf den Kopf getroffen. Vielen Dank! Meine Lösung war, Bound Fields anstelle von TemplateFields zu verwenden. Danke noch einmal. – KellyMarchewa