Using Crystal Reports in Visual Studio 2005 (C# .NET Windows App)

By : Piku
Source: Stackoverflow.com
Question!

I need to create reports in a C# .NET Windows app. I've got an SQL Server 2005 database, Visual Studio 2005 and am quite OK with creating stored procedures and datasets.

Can someone please point me in the right direction for creating reports? I just can't seem work it out. Some examples would be a good start, or a simple How-to tutorial... anything really that is a bit better explained than the MSDN docs.

I'm using the CrystalDecisions.Windows.Forms.CrystalReportViewer control to display the reports, I presume this is correct.

If I'm about to embark on a long and complex journey, what's the simplest way to create and display reports that can also be printed?

By : Piku


Answers

I have tried RS. I am converting from RS back to Crystal. RS is just too heavy and slow (or something). There is no reason to have to wait 30 seconds for a report to render is RS when Crystal does it in under a second.

By : Mark Vick




I have managed to make this work now.

Brief Overview

It works by having a 'data class' which is just a regular C# class containing variables and no code. This is then instantiated and filled with data and then placed inside an ArrayList. The ArrayList is bound to the report viewer, along with the name of the report to load. In the report designer '.Net Objects' are used, rather than communicating with the database.

Explanation

I created a class to hold the data for my report. This class is manually filled by me by manually retrieving data from the database. How you do this doesn't matter, but here's an example:

DataSet ds = GeneratePickingNoteDataSet(id);
foreach (DataRow row in ds.Tables[0].Rows) {
    CPickingNoteData pickingNoteData = new CPickingNoteData();

    pickingNoteData.delivery_date = (DateTime)row["delivery_date"];
    pickingNoteData.cust_po = (int)row["CustomerPONumber"];
    pickingNoteData.address = row["CustomerAddress"].ToString();
    // ... and so on ...

    rptData.Add(pickingNoteData);
}

The class is then put inside an ArrayList. Each element in the arraylist corresponds to one 'row' in the finished report.

The first element in the list can also hold the report header data, and the last element in the list can hold the report footer data. And because this is an ArrayList, normal Array access can be used to get at them:

((CPickingNoteData)rptData[0]).header_date = DateTime.Now;
((CPickingNoteData)rptData[rptData.Count-1]).footer_serial = GenerateSerialNumber();

Once you have an arraylist full of data, bind it to your report viewer like this, where 'rptData' is of type 'ArrayList'

ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(reportPath);
reportDoc.SetDataSource(rptData);
crystalReportViewer.ReportSource = reportDoc;

Now you will need to bind your data class to the report itself. You do this inside the designer:

  1. Open the Field Explorer tab (which might be under the 'View' menu), and right-click "Database Fields"
  2. Click on 'Project Data'
  3. Click on '.NET Objects'
  4. Scroll down the list to find your data class (if it isn't there, compile your application)
  5. Press '>>' and then OK
  6. You can now drag the class members onto the report and arrange them as you want.
By : Piku


This video can help you solving your question :)
By: admin