Click here to Skip to main content
13,200,729 members (54,116 online)
Click here to Skip to main content
Add your own
alternative version

Stats

443.8K views
22.4K downloads
155 bookmarked
Posted 28 Sep 2007

Dynamic Crystal Report with C#

, 29 Sep 2007
Rate this:
Please Sign up or sign in to vote.
This program shows how to dynamically load data from a database and application into the Crystal Report
Screenshot - pic2.jpg

Introduction

This program shows how to dynamically load data from a database and application into the Crystal Report. By using this program, we can customize a Crystal Report to some limit at run time of the application like specifying which field (Columns of a particular table) should be displayed in the report.

Background

This problem arose because a group of students from SLIIT asked me how to dynamically generate a Crystal Report using C# 2.0 (.NET 2005). I tried to find a solution for this by searching many forums and sites, but unfortunately I couldn't find any solution for that. Some forums said that there is no way to create dynamic Crystal Reports using .NET 2005. Finally, I found a way to do that.

Using the Code

  1. Create a C# project or add a Form to your existing project.

    Now you can add Checkboxes that correspond to columns of a particular table that should be displayed in the Crystal Report and CrystalReportViewer control to the form.

Screenshot - pic4.jpg

For this demonstration, I have created a database called db1.mdb (in bin\Debug) using Access and created a table called Customer.

  1. Add a DataSet (*.xsd file) to your project using add -> New Items in solution explorer. After that, add a DataTable to the DataSet.

    Screenshot - pic5.jpg

    Add columns to DataTable and name them Column1, Column2, and so on. The number of columns depends on how many columns should be displayed in the Crystal report.

  2. Add a Crystal Report into the project and using the Report Wizard, choose ADO.NET DataSets of the Project data source as the data source of the Crystal Report and select Customer data table of DataSet1 as the selected table of the Crystal Report. Then select fields to be displayed in your report. Then remove Column1…, Column5 objects in Section 2 of the Crystal Report.

    Screenshot - pic7.jpg

    Screenshot - pic8.jpg

  3. Now add parameters called col1, col2col5 (the number of parameters should be equal to the number of columns displayed in the Crystal Report.) using Field Explorer.

    Screenshot - pic9.jpg

  4. Add the following method to your Form for Create SQL SELECT query and assign values to parameters of the Crystal Report according to user selected columns that should be displayed on your report.

    /// <span class="code-SummaryComment"><summary></span>
    /// This method is used to 
    /// 1. create SELECT query according to the selected column names and 
    /// 2. create parameters and assign values for that parameter
    /// that correspond to the crystal report.
    /// NOTE: This parameter is used to display Column names of the 
    /// Crystal Report according to the user selection.
    /// <span class="code-SummaryComment"></summary></span>
    /// <span class="code-SummaryComment"><returns></returns></span>
    private string CreateSelectQueryAndParameters()
    {
        ReportDocument reportDocument;
        ParameterFields paramFields;
        
        ParameterField paramField;
        ParameterDiscreteValue paramDiscreteValue;
    
        reportDocument = new ReportDocument();
        paramFields = new ParameterFields();
                   
        string query = "SELECT ";
        int columnNo = 0;                
    
        if (chbCode.Checked)
        {
            columnNo++;
            query = query.Insert(query.Length, "Code as Column" +
            columnNo.ToString());
    
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "Customer Code";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
        if (chbFirstName.Checked)
        {
            columnNo++;
            if (query.Contains("Column"))
            {
                query = query.Insert(query.Length, ", ");
            }
            query = query.Insert(query.Length, "FirstName as Column" +
            columnNo.ToString());
            
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "First Name";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
        if (chbLastName.Checked)
        {
            columnNo++; //To determine Column number
            if (query.Contains("Column"))
            {
                query = query.Insert(query.Length, ", ");
            }
            query = query.Insert(query.Length, "LastName as Column" +
            columnNo.ToString());
                            
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "Last Name";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
        if (chbAddress.Checked)
        {
            columnNo++;
            if (query.Contains("Column"))
            {
                query = query.Insert(query.Length, ", ");
            }
            query = query.Insert(query.Length, "Address as Column" +
            columnNo.ToString());
                            
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "Address";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
        if (chbPhone.Checked)
        {
            columnNo++;
            if (query.Contains("Column"))
            {
                query = query.Insert(query.Length, ", ");
            }
            query = query.Insert(query.Length, "Phone as Column" +
            columnNo.ToString());
    
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "Phone";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
    
        //if there is any remaining parameter, assign empty value for that 
        //parameter.
        for (int i = columnNo; i < 5; i++)
        {
            columnNo++;
            paramField = new ParameterField();
            paramField.Name = "col" + columnNo.ToString();
            paramDiscreteValue = new ParameterDiscreteValue();
            paramDiscreteValue.Value = "";
            paramField.CurrentValues.Add(paramDiscreteValue);
            //Add the paramField to paramFields
            paramFields.Add(paramField);
        }
               
        crystalReportViewer1.ParameterFieldInfo = paramFields;
        
        query += " FROM Customer" ;
        return query;
    }
    //
  5. Add the following method to the button click event to display a report when the user presses the button:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    
    using CrystalDecisions.CrystalReports.Engine;
    using CrystalDecisions.ReportSource;
    using CrystalDecisions.Shared;
    using CrystalDecisions.Windows.Forms;
    
    namespace app5
    {
        public partial class Form1 : Form
        {
            CrystalReport1 objRpt;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                objRpt = new CrystalReport1();
    
                string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=|DataDirectory|\\db1.mdb"; 
               
                //Get Select query String and add parameters to the 
                //Crystal report.
                string query = CreateSelectQueryAndParameters();
    
                //if there is no item select, then exit from the method.
                if (!query.Contains("Column"))
                {
                    MessageBox.Show("No selection to display!");
                    return;
                }
    
                try
                {
                    OleDbConnection Conn = new OleDbConnection(connString);
    
                    OleDbDataAdapter adepter = 
                    new OleDbDataAdapter(query, connString);
                    DataSet1 Ds = new DataSet1();
    
                    adepter.Fill(Ds, "Customer");
                    
                    objRpt.SetDataSource(Ds);
                    crystalReportViewer1.ReportSource = objRpt;
                }
                catch (OleDbException oleEx)
                {
                    MessageBox.Show(oleEx.Message);
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(Ex.Message);
                }
            }

History

  • 29th September, 2007: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Manjula Wickramathunga
Team Leader Midas Safety Inc
Sri Lanka Sri Lanka
Manjula Wickramathunga currently is working at Midas Safety Inc as a Senior Consultant Integration Services. He is working with SAP and Microsoft Technologies such as C#, MS SQL server, ASP.NET, ASP.NET MVC, WebAPI.

You may also be interested in...

Comments and Discussions

 
QuestionMy Vote of 5 Pin
roshandavid5-Jan-12 5:58
memberroshandavid5-Jan-12 5:58 
GeneralMy Vote of 5 Pin
RaviRanjankr3-Dec-11 3:22
memberRaviRanjankr3-Dec-11 3:22 
GeneralMy vote of 5 Pin
avcas29-Nov-11 5:05
memberavcas29-Nov-11 5:05 
GeneralMy vote of 5 Pin
santosh kundkar18-Oct-11 19:23
membersantosh kundkar18-Oct-11 19:23 
QuestionThank you.... Pin
jyothi87.u28-Sep-11 4:50
memberjyothi87.u28-Sep-11 4:50 
GeneralMy vote of 5 Pin
jyothi87.u28-Sep-11 4:49
memberjyothi87.u28-Sep-11 4:49 
GeneralDynamic columns without specifying all column names in the report Pin
aswathy.s.888-Jun-11 23:19
memberaswathy.s.888-Jun-11 23:19 
Questionerror in creating Dynamic Crystal Report with C# Pin
Member 78825659-May-11 22:11
memberMember 78825659-May-11 22:11 
i am making desktop application using C#.Net and Sql SERVER 2008.I want to make crystal reports after seen your this article i am able to create crystal report...how u wrote in article i did same but when i select the checkbox for report i am getting error "incorrect parameter".i have created a table called Media_Method with fields(Media_method_ID,Media_Name,Target_Audience).Parameter fields after adding crystal report is id,name,target respectively .I have tried follwing code

private string CreateSelectQueryAndParameters()
{
ReportDocument reportDocument;
            ParameterFields paramFields;
 
            ParameterField paramField;
            ParameterDiscreteValue paramDiscreteValue;
 
            reportDocument = new ReportDocument();
            paramFields = new ParameterFields();
 
            string query = "SELECT ";
            int columnNo = 0;
 
            if (chbid.Checked)
            {
                columnNo++;
                query = query.Insert(query.Length, "Media_method_ID as Column" +
                columnNo.ToString());
                paramField = new ParameterField();
                paramField.Name = "id" + columnNo.ToString();
                paramDiscreteValue = new ParameterDiscreteValue();
                paramDiscreteValue.Value = "Media method ID";
                paramField.CurrentValues.Add(paramDiscreteValue);
                //Add the paramField to paramFields
                paramFields.Add(paramField);
            }
            if (chbname.Checked)
            {
                columnNo++;
                if (query.Contains("Column"))
                {
                    query = query.Insert(query.Length, ", ");
                }
                query = query.Insert(query.Length, "Media_Name as Column" +
                columnNo.ToString());
 
                paramField = new ParameterField();
                paramField.Name = "col" + columnNo.ToString();
                paramDiscreteValue = new ParameterDiscreteValue();
                paramDiscreteValue.Value = "Media Name";                paramField.CurrentValues.Add(paramDiscreteValue);
                //Add the paramField to paramFields
                paramFields.Add(paramField);
            }
            if (chbtarget.Checked)
            {
                columnNo++; //To determine Column number
                if (query.Contains("Column"))
                {
                    query = query.Insert(query.Length, ", ");
                }
                query = query.Insert(query.Length, "Target_Audience as Column" +
                columnNo.ToString());
 
                paramField = new ParameterField();
                paramField.Name = "col" + columnNo.ToString();             
                paramDiscreteValue = new ParameterDiscreteValue();
                paramDiscreteValue.Value = "Target Audience";
 
                paramField.CurrentValues.Add(paramDiscreteValue);
                //Add the paramField to paramFields
                paramFields.Add(paramField);
            }
           
 
            //if there is any remaining parameter, assign empty value for that 
            //parameter.
            for (int i = columnNo; i < 5; i++)
            {
                columnNo++;
                paramField = new ParameterField();
                paramField.Name = "col" + columnNo.ToString();
                paramDiscreteValue = new ParameterDiscreteValue();
                paramDiscreteValue.Value = "";
                paramField.CurrentValues.Add(paramDiscreteValue);
                //Add the paramField to paramFields
                paramFields.Add(paramField);
            }
 
            crystalReportViewer1.ParameterFieldInfo = paramFields;
 
            query += " FROM Media_Method";
            return query;
        }


please check bold content properly



private void button1_Click(object sender, EventArgs e)
        {
            CrystalReport1 objRpt = new CrystalReport1();
 
            string connString = "Data Source=SW-PC-20;Initial Catalog=PSM;Integrated Security=True";
 
            //Get Select query String and add parameters to the 
            //Crystal report.
            string query = CreateSelectQueryAndParameters();
 
            //if there is no item select, then exit from the method.
            if (!query.Contains("Column"))
            {
                MessageBox.Show("No selection to display!");
                return;
            }
 
            try
            {
                SqlConnection Conn = new SqlConnection(connString);
 
                SqlDataAdapter   adepter =
                new SqlDataAdapter(query, connString);
                DataSet1 Ds = new DataSet1();
 
                adepter.Fill(Ds, "Media_Method");
 
                objRpt.SetDataSource(Ds);
                crystalReportViewer1.ReportSource = objRpt;
            }
            catch (SqlException oleEx)
            {
                MessageBox.Show(oleEx.Message);
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }
 
        }

please help me if i am wrong
GeneralMy vote of 4 Pin
Harry HJ Neethling9-May-11 2:44
memberHarry HJ Neethling9-May-11 2:44 
GeneralProblem with crystal report layout (dynamic) Pin
intelcore2quad8819-Feb-11 20:40
memberintelcore2quad8819-Feb-11 20:40 
GeneralThanks Pin
melda_4447-Feb-11 3:43
membermelda_4447-Feb-11 3:43 
GeneralThanks Pin
Captainobvious1-Feb-11 22:04
memberCaptainobvious1-Feb-11 22:04 
GeneralMy vote of 5 Pin
Аslam Iqbal16-Jan-11 19:58
memberАslam Iqbal16-Jan-11 19:58 
GeneralNeed a VB version Pin
Shiblee16925-Oct-10 6:32
memberShiblee16925-Oct-10 6:32 
GeneralThank You !!! Pin
gayanperera018-Oct-10 20:28
membergayanperera018-Oct-10 20:28 
GeneralMy vote of 5 Pin
sheetalbhalerao17-Sep-10 1:45
membersheetalbhalerao17-Sep-10 1:45 
GeneralMy vote of 5 Pin
Rofael9-Aug-10 4:07
memberRofael9-Aug-10 4:07 
GeneralMy vote of 4 Pin
Iakovos Karakizas9-Aug-10 1:38
memberIakovos Karakizas9-Aug-10 1:38 
GeneralThank you! It helps a lot. Pin
ben197815-May-10 9:09
memberben197815-May-10 9:09 
Generalsiraaaaaaaa Pin
amilakandambi11-Apr-10 19:42
memberamilakandambi11-Apr-10 19:42 
GeneralMy vote of 1 Pin
ssmani84195-Apr-10 19:55
memberssmani84195-Apr-10 19:55 
GeneralMy vote of 1 Pin
ssmani84195-Apr-10 19:53
memberssmani84195-Apr-10 19:53 
Generaldynamic report in asp.net Pin
niktana16-Mar-10 20:08
memberniktana16-Mar-10 20:08 
Generalcolumn names not displaying. Pin
rowter12-Jan-10 8:19
memberrowter12-Jan-10 8:19 
Questionhow to display the column names? Pin
rowter4-Jan-10 18:07
memberrowter4-Jan-10 18:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.171020.1 | Last Updated 29 Sep 2007
Article Copyright 2007 by Manjula Wickramathunga
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid