Seperti yang telah dijelaskan di artikel sebelumnya bahwa kita bisa merubah Sort Order record berdasarkan kolom tertentu yang sudah dikelompokkan secara runtime dengan menggunakan class SortFields dan SortField. Pada artikel kali ini saya akan membuat contoh bagaimana kita bisa merubah data yang sudah dikelompokkan berdasarkan kolom yang dipilih oleh user secara runtime.
Secara prinsip sebenarnya tidak begitu berbeda dengan yang dilakukan untuk merubah SortOrder. Untuk dapat melakukan hal tersebut kita perlu mendapatkan informasi Group dari report yang digunakan. Dengan menggunakan class Groups yang terdapat di dalam namespace CrystalDecisions.CrystalReports.Engine informasi tsb dapat kita gunakan. Untuk merubah groupingnya dilakukan looping collection group yang terdapat di dalam Groups. Properti ConditionField dari object Group digunakan untuk assign value berupa field yang akan digunakan untuk grouping. Value tersebut harus berupa object FieldDefinition. Dari FieldDefinition tsb kita dapat merubah grouping secara run time. Sebagai tambahan, untuk merubah HeaderText kolom yang sudah ada pada crystal report, kita dapat melakukannya dengan cara seperti ini (misal : HeaderText di report mempunyai id "txtHeader" dan akan dirubah secara runtime properti text yang bersangkutan) , teknik ini akan digunakan untuk merubah header text kolom sesuai dengan kolom yang dipilih:
TextObject txtHeader;
txtHeader = rpt.ReportDefinition.ReportObjects["txtHeader"]
as TextObject;
txtHeader.Text = "Header Text Baru;
Contoh aplikasi yang dibuat menggunakan data dari tabel Customers database Northwind. Ketika design time report tsb di group berdasarkan kolom Region, tapi nantinya secara run time dapat dirubah sesuai dengan kolom yang dipilih. Source code dapat anda download, dimana source code ini berisi artikel-artikel crystal report sebelumnya untuk SortingOrder, Select Data Between Date, dsb...Mari kita lihat code nya secara lengkap :
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.SqlClient;
using CrystalDecisions.CrystalReports.Engine;
namespace CrystalReportsApp
{
public partial class frmChangeGroup : Form {
DataTable dtCustomers = new DataTable();
rptGroupBy rpt = new rptGroupBy();
public frmChangeGroup()
{
InitializeComponent();
}
private void SetReportDataSource()
{
using (SqlConnection sqlConn = new SqlConnection(
@"Database=Northwind2005;Uid=sa;Pwd=sql2005;Server=.\SQL2005"))
{
using (SqlCommand sqlCmd = new SqlCommand())
{
sqlCmd.CommandType = CommandType.Text;
sqlCmd.Connection = sqlConn;
sqlCmd.CommandText =
"Select * From Customers" +
" Where Region Is Not Null And Country Is Not Null";
if (sqlConn.State == ConnectionState.Closed) sqlConn.Open();
dtCustomers.Load(sqlCmd.ExecuteReader());
rpt.SetDataSource(dtCustomers);
crystalReportViewer1.ReportSource = rpt;
}
}
}
private void ChangeGroupField(string ColumnName)
{
Groups secGroups;
secGroups = rpt.DataDefinition.Groups;
FieldDefinition objField;
objField = rpt.Database.Tables["Customers"].Fields[ColumnName];
foreach (Group aGroup in secGroups)
{
aGroup.ConditionField = objField;
}
TextObject txtHeader;
txtHeader = rpt.ReportDefinition.ReportObjects["txtHeader"]
as TextObject;
txtHeader.Text = ColumnName;
crystalReportViewer1.ReportSource = rpt;
}
private void frmChangeGroup_Load(object sender, EventArgs e)
{
SetReportDataSource();
}
private void btnChangeGroup_Click(object sender, EventArgs e)
{
ChangeGroupField(comboBox1.Text);
}
}
}
