2016-08-02 42 views
0

我正在構建一個應用程序,需要在GridView控件中顯示數據,按特定值分組,然後將其導出爲PDF.I使用這組這裏的分類(http://www.agrinei.com/gridviewhelper/gridviewhelper_pt.htm)用於分組,它運行良好。但是,我必須將EnableViewState設置爲false才能正常工作。當我需要將其導出到PDF時,問題就出現了。以前(在使用GridViewHelper之前),這是行得通的。但是,它現在生成一個空的報告(我想因爲EnableViewState爲false)。ASP.NET - 當EnableViewState設置爲False時檢索網格視圖數據

如何保存通過使用GridViewHelper類生成的GridView的數據和結構以將其導出爲PDF?

一些我的aspx的(略去了部分代碼)

public partial class all : System.Web.UI.Page 
{ 
    Int32 userID; 
    Int32 currentID; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     GridViewHelper helper = new GridViewHelper(allTicketGrid); 
     helper.RegisterGroup("propName", true, true); 
     helper.ApplyGroupSort(); 
     userID = Convert.ToInt32(Session["userID"]); 
     if (Session["userLevel"] == null || Session["userLevel"] == "") 
     { 
      Response.Redirect("~/Default.aspx"); 
     } 

     if (!IsPostBack) 
     { 

      this.populate(); 
     } 
    } 

    protected void populate() 
    { 
     toDateBox.Text = DateTime.Now.ToShortDateString(); 
     fromDateBox.Text = DateTime.Now.ToShortDateString(); 
     using (ticketModel dbContext = new ticketModel()) 
     { 


      END_USER user = dbContext.END_USER.First(u => u.END_USER_ID == userID); 

      itemCheckBoxList.DataSource = dbContext.ITEM_TYPE.ToList(); 
      itemCheckBoxList.DataTextField = "DESCRIPTION"; 
      itemCheckBoxList.DataValueField = "ITEM_TYPE_ID"; 
      itemCheckBoxList.DataBind(); 

      List<Int32> propIDList = new List<Int32>(); 

      foreach(END_USER_PROPERTY item in user.END_USER_PROPERTY.ToList()) { 
       propIDList.Add((Int32)item.PROPERTY_ID); 
      } 
      locationCheckBoxList.DataSource = dbContext.PROPERTies.Where(p=> propIDList.Contains(p.PROPERTY_ID)).ToList(); 
      locationCheckBoxList.DataTextField = "SHORT_NAME"; 
      locationCheckBoxList.DataValueField = "PROPERTY_ID"; 
      locationCheckBoxList.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.Trim(); 
      } 
      dt.Rows.Add(dr); 

     } 

      Document doc = pdfWorker.readyDocument(); 
     pdfWorker.createTable(doc, dt); 

     String filePath = Server.MapPath("~/reports/files/");   
     String fileName = "report_" + DateTime.Now.ToString("MM-dd-yyyy") + ".pdf"; 
     filePath += fileName; 
     pdfWorker.savePDF(doc, filePath); 
     Response.ContentType = "application/pdf"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); 
     Response.TransmitFile(filePath); 
     Response.End(); 
     } 

    protected void generateReport(object sender, EventArgs e) 
    { 
     int[] selectedLocations = getLocations(); 
     int[] selectedItemTypes = getItems(); 
     DateTime from = Convert.ToDateTime(fromDateBox.Text); 
     DateTime to = Convert.ToDateTime(toDateBox.Text); 


     if (!allButton.Checked) 
     { 
      Int32 statusID; 
      if (openButton.Checked) 
      { 
       statusID = 1; 
      } 
      else 
      { 
       statusID = 2; 
      } 

      using (ticketModel dbContext = new ticketModel()) 
      { 
       allTicketGrid.DataSource = dbContext.TICKETs.Where(t => t.STATUS_TYPE.STATUS_TYPE_ID == statusID && selectedLocations.Contains(t.PROPERTY_ID) && selectedItemTypes.Contains(t.ITEM_TYPE_ID) && t.OPEN_STATUS.UPDATED_DATE >= from && t.OPEN_STATUS.UPDATED_DATE <= to).ToList(); 
       allTicketGrid.DataBind(); 
      } 

     } 
     else 
     { 

      using (ticketModel dbContext = new ticketModel()) 
      { 
       allTicketGrid.DataSource = dbContext.TICKETs.Where(t => selectedLocations.Contains(t.PROPERTY_ID) && selectedItemTypes.Contains(t.ITEM_TYPE_ID) && t.OPEN_STATUS.UPDATED_DATE >= from && t.OPEN_STATUS.UPDATED_DATE <= to).ToList(); 
       allTicketGrid.DataBind(); 
      } 

     } 


    } 

和我pdfWorker類:​​

static class pdfWorker 
    { 
      public static Document readyDocument() { 
     Document doc = new Document(); 
     Section section = doc.AddSection(); 
     Style docStyles = doc.Styles["Normal"]; 
     docStyles.Document.DefaultPageSetup.Orientation = MigraDoc.DocumentObjectModel.Orientation.Landscape; 
     docStyles.Font.Size = 8; 
       docStyles.ParagraphFormat.FirstLineIndent = 0; 

     return doc; 
     } 

     public static void createTable(Document document, DataTable dataTable) 
     { 
      Table table = new Table(); 
      table.Format.Font.Size = 6; 
      table.BottomPadding = 10; 

      int colCount = dataTable.Columns.Count; 
      Row pdfRow; 
      Cell pdfCell; 



      for (int i = 0; i < colCount; i++) 
       { 
        table.AddColumn(); 

       } 

      pdfRow = table.AddRow(); 
      for (int i = 0; i < colCount; i++) 
      { 


       pdfCell = pdfRow.Cells[i]; 
       pdfCell.Row.Format.Font.Size = 10; 
       pdfCell.AddParagraph(dataTable.Columns[i].ToString()); 

      } 

      foreach (DataRow row in dataTable.Rows) 
      { 

       pdfRow = table.AddRow(); 
       pdfRow.HeightRule = RowHeightRule.AtLeast; 
       for (int i = 0; i < colCount; i++) 
       { 

        pdfCell = pdfRow.Cells[i]; 
        pdfCell.AddParagraph(row[i].ToString()); 


       } 
      } 

      document.LastSection.Add(table); 
     } 

       public static void savePDF(Document doc, String fileName) { 
       PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); 
       SaveFileDialog saveDialog = new SaveFileDialog(); 

         renderer.Document = doc; 
         renderer.RenderDocument(); 
         renderer.PdfDocument.Save(fileName); 




      } 


     } 

    } 

感謝這麼多的幫助。

+0

你能不能叫'populate'在'exportReport'的開始? – ConnorsFan

+0

不幸的是,這並沒有奏效。不過謝謝。 – KellyMarchewa

+0

對不起,我認爲使用'populate'將數據綁定到GridView。我添加了一個答案。 – ConnorsFan

回答

1

你可以把填充GridView控件在一個單獨的方法的代碼:

protected void generateReport(object sender, EventArgs e) 
{ 
    BindReportData(); 
} 

private void BindReportData() 
{ 
    int[] selectedLocations = getLocations(); 
    int[] selectedItemTypes = getItems(); 
    DateTime from = Convert.ToDateTime(fromDateBox.Text); 
    DateTime to = Convert.ToDateTime(toDateBox.Text); 

    if (!allButton.Checked) 
    { 
     Int32 statusID; 
     if (openButton.Checked) 
     { 
      statusID = 1; 
     } 
     else 
     { 
      statusID = 2; 
     } 

     using (ticketModel dbContext = new ticketModel()) 
     { 
      allTicketGrid.DataSource = dbContext.TICKETs.Where(t => t.STATUS_TYPE.STATUS_TYPE_ID == statusID && selectedLocations.Contains(t.PROPERTY_ID) && selectedItemTypes.Contains(t.ITEM_TYPE_ID) && t.OPEN_STATUS.UPDATED_DATE >= from && t.OPEN_STATUS.UPDATED_DATE <= to).ToList(); 
      allTicketGrid.DataBind(); 
     } 
    } 
    else 
    { 
     using (ticketModel dbContext = new ticketModel()) 
     { 
      allTicketGrid.DataSource = dbContext.TICKETs.Where(t => selectedLocations.Contains(t.PROPERTY_ID) && selectedItemTypes.Contains(t.ITEM_TYPE_ID) && t.OPEN_STATUS.UPDATED_DATE >= from && t.OPEN_STATUS.UPDATED_DATE <= to).ToList(); 
      allTicketGrid.DataBind(); 
     } 
    } 
} 

,並調用該方法在exportReport開始:

protected void exportReport(object sender, EventArgs e) 
{ 
    BindReportData(); 
    ... 
} 
+0

謝謝,它的工作原理。我只是可能需要做一些修改才能顯示分組標題,但是再次感謝! :) – KellyMarchewa

相關問題