【分享】水晶报表:运行时单击表头排序C#版

flydragon0815 2008-12-23 11:29:03
加精
序:
这是一篇继 海波 发表“经典水晶报表--单击表头排序”于 @ 2003年12月25日 10:26:00 ) 的首篇C#版本。

若有人转载请注明出处。
本文同步发布于我的博客:《经典水晶报表--单击表头排序(2008年版)》
http://blog.csdn.net/flydragon0815/archive/2008/12/21/3568052.aspx

开发环境:VS2005,及该版本自带的水晶报表
本文的前提是,报表都能完全显示数据

1.单击表头的第一个字段:右键→设置对象格式,如下图





2.然后在“格式编辑器”中,超级链接→Internet上的网站(A),然后在“网站地址(I)”下面输入:“Flydragon0815.aspx?FieldName=Location”,本页面的名字:“Flydragon0815.aspx”,“FieldName”为参数的名字,也就是该字段的名称,“Flydragon0815.aspx”为要加载该报表的页面。

“Flydragon0815.aspx?FieldName=Location”这样写的目的是把“Location”这个名字传到的后台代码中,以便控制排序


3.这一步比较重要,在报表的空白处右键:报表→记录排序专家



4 把该字添加到“排序字段”中,提示:这一步较重要,其它字段排序时不用选了,选择这一个就可以了,如果多选的话,可能就不能排序了。




这些基本的操作完成后,

先看一下预览的界面,按Loaction排序前



按“Location”排序后:


以下是源代码:


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using CrystalDecisions.CrystalReports.Engine;

public partial class _Default : System.Web.UI.Page
{
public string g_MyConnection = System.Configuration.ConfigurationManager.ConnectionStrings["MyconnectionStrings"].ToString();
private static ReportDocument m_ReportDoc =new ReportDocument();
private static string m_strGetFldName = null;
private static bool m_FlagOrder = false;//用来判断排序的方式:AscendingOrder,DescendingOrder
private static bool m_FlagOverPage = false;//控制是否是“IsPostBack”的翻页标志
protected void Page_Load(object sender, EventArgs e)
{
}

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (IsPostBack)
{
//获取缓存的报表
m_ReportDoc = (ReportDocument)Session["Report"];
if (m_ReportDoc == null)
{
ReportDoc_Bind();
}
m_strGetFldName = null;
this.crystalReportViewer.ReportSource = m_ReportDoc;
m_FlagOverPage = true;
}
if (m_FlagOverPage)
{
m_FlagOverPage = false;
}
else
{
if (m_ReportDoc != null)
{
m_strGetFldName = Request.QueryString["FieldName"];
if (m_strGetFldName != null)
{
GetFieldName(m_strGetFldName);
}
}
}
}
/// <summary>
/// 获得要排序的字段
/// </summary>
/// <param name="strFieldName"></param>
private void GetFieldName(string strFieldName)
{
try
{
FieldDefinition FieldDef = null;

FieldDef = m_ReportDoc.Database.Tables[0].Fields[strFieldName];//把从“数据库”中取的该字段赋给 FieldDef

m_ReportDoc.DataDefinition.SortFields[0].Field = FieldDef;//然后再赋给要排序的字段名称

if (m_FlagOrder == false)
{

m_ReportDoc.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.AscendingOrder;
m_FlagOrder = true;
}
else
{
m_ReportDoc.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.DescendingOrder;

m_FlagOrder = false;
}
crystalReportViewer.ReportSource = m_ReportDoc;
crystalReportViewer.ShowLastPage(); //获取页数
crystalReportViewer.ShowFirstPage();
}
catch (Exception ee)
{
Response.Write("<b><font color='#FF0000'>Operate Error!</font></b>");
}
}
/// <summary>
/// 绑定报表
/// </summary>
private void ReportDoc_Bind()
{
string sql = "select ct.XK_TEXT as Location, pt.XK_RECEIPT_DATE_TIME as DateStart, " +
" pt.XK_RECEIPT_DATE_TIME as DateEnd, pt.XK_PLU as Dept, pt.XK_RECEIPT_NUM as Receipt#, " +
" p.XK_TEXT as Item#, pt.XK_QUANTITY as Quantity, pt.XK_AMOUNT as Amount " +
" from XK_CASH_TERMINAL ct left outer join XK_POS_TRANSACTION pt on ct.XK_ID = pt.XK_CASH_TERMINAL_ID " +
" left outer join XK_PRODUCT p on pt.XK_PROD_CODE = p.XK_CODE where 1=1 and pt.XK_STATUS IS NULL ";
SqlConnection conn = new SqlConnection(g_MyConnection);
System.Data.SqlClient.SqlDataAdapter MyCommand = new SqlDataAdapter(sql, conn);

DataSet ds = new DataSet();
MyCommand.Fill(ds);
ReportDocument m_ReportDoc = new ReportDocument();

m_ReportDoc.Load(Server.MapPath("Crystalrpt.rpt"));
m_ReportDoc.SetDataSource(ds.Tables[0]);
Session["Report"] = m_ReportDoc;
conn.Close();
}

protected void btnOk_Click(object sender, EventArgs e)
{
ReportDoc_Bind();

this.crystalReportViewer.ReportSource = m_ReportDoc;//显示报表

}
}

===================================================================
转载请注明出处:
http://blog.csdn.net/flydragon0815/archive/2008/12/21/3568052.aspx
...全文
2188 103 打赏 收藏 转发到动态 举报
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
玉儿 2012-09-24
  • 打赏
  • 举报
回复
mark
shin_vv 2011-12-17
  • 打赏
  • 举报
回复
谢了谢了
wf727251593 2011-12-12
  • 打赏
  • 举报
回复
mark
zzc_king 2011-08-16
  • 打赏
  • 举报
回复
标记一下
狗豆腐 2011-07-26
  • 打赏
  • 举报
回复
谢谢,楼主先。
allen3010 2011-05-31
  • 打赏
  • 举报
回复
mark
alian_1126 2010-09-30
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
回复也很精彩!!
sdnjiejie65 2010-04-28
  • 打赏
  • 举报
回复
学习...
buyicui 2009-03-10
  • 打赏
  • 举报
回复
不错,很好!!!!!
阿泰 2009-03-09
  • 打赏
  • 举报
回复
点击排序 单纯看这个自然是简单的,无论是在winform还是webform里。
但是前提是在【水晶报表】里怎么去实现,我想flydragon0815这个是唯一的方法。

其实之前看了lzmch11的博冉CellReport报表 (如果我没记错的话),lzmch11的技术水平自然很高是无疑了
但是回复问题,还是要看问题的命题是什么。或者,单就这个问题而言,你有什么更好的实现方法吗?


PS:
flydragon0815,水晶报表2008里,已经可以直接支持点击表头排序了,不需要写代码,呵呵。
另外,可以接贴了哦?呵呵。这个帖子加精华后,可以很容易在
https://forum.csdn.net/SList/DotNETReport/EssentialList 找到的
flydragon0815 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 90 楼 lzmch11 的回复:]
点击排序这么简单的东西都不会?还这么多人跟风。哎
[/Quote]

牛人,我顶你,可能你比较厉害吧,我在这儿献丑了,呵呵
03年到08年,5年的时间吧?
cadust 2009-03-04
  • 打赏
  • 举报
回复
mark&&&&
lzmch11 2009-03-04
  • 打赏
  • 举报
回复
点击排序这么简单的东西都不会?还这么多人跟风。哎
crescens 2009-03-02
  • 打赏
  • 举报
回复
好东西啊
flydragon0815 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 jwy0126 的回复:]
FiledName是字段名,怎么Location也是?
[/Quote]

FieldName=Location
FileName=Dept

FileName 表示要把排序的字段,如“Location,Dept”等传到代码中去

现在你能看到图片了,结合图片,你能更清楚的看到具体的操作过程
jwy0126 2009-02-06
  • 打赏
  • 举报
回复
FiledName是字段名,怎么Location也是?
jwy0126 2009-02-05
  • 打赏
  • 举报
回复
就是不明白你那个Location是什么意思?
jwy0126 2009-02-05
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Data.SqlClient;

public partial class CrystalReport : System.Web.UI.Page
{
private SqlConnection sqlcon = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connstring"]);
private SqlDataAdapter sd ;

private static ReportDocument myReport = new ReportDocument();
private static string m_strGetFldName = null;
private static bool m_FlagOrder = false;//用来判断排序的方式:AscendingOrder,DescendingOrder
private static bool m_FlagOverPage = false;//控制是否是“IsPostBack”的翻页标志


protected void Page_Load(object sender, EventArgs e)
{
//((System.Windows.Forms.TabControl)CrystalReportViewer1.Controls[0].Controls[0]).TabPages[0].Text = "人员详细信息";
ConfigueCrystalReport();

}

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (IsPostBack)
{
//获取缓存的报表
myReport = (ReportDocument)Session["Report"];
if (myReport == null)
{
ConfigueCrystalReport();
}
m_strGetFldName = null;
this.CrystalReportViewer1.ReportSource = myReport;
m_FlagOverPage = true;
}
if (m_FlagOverPage)
{
m_FlagOverPage = false;
}
else
{
if (myReport != null)
{
m_strGetFldName = Request.QueryString["PerId"];
if (m_strGetFldName != null)
{
GetFieldName(m_strGetFldName);
}
}
}
}


//配置水晶报表数据库
private void ConfigueCrystalReport()
{
string sqlstr = "select * from [Person]";
sqlcon.Open();
sd = new SqlDataAdapter(sqlstr, sqlcon);
DataSet ds = new DataSet();
sd.Fill(ds);

TableLogOnInfo myLogInfo = new TableLogOnInfo();
string strPath = Server.MapPath("CrystalReport.rpt");
ReportDocument myReport = new ReportDocument();

myReport.Load(strPath);
this.CrystalReportViewer1.ReportSource = myReport;

myLogInfo.ConnectionInfo.ServerName = "(local)";
myLogInfo.ConnectionInfo.DatabaseName = "Persons";
myLogInfo.ConnectionInfo.UserID = "sa";
myLogInfo.ConnectionInfo.Password = "123456";
myReport.Database.Tables[0].ApplyLogOnInfo(myLogInfo);

Session["Report"] = myReport;
sqlcon.Close();


}

/// <summary>
/// 返回到上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("Person.aspx");
}


/// <summary>
/// 打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
ReportDocument myReport = new ReportDocument();
TableLogOnInfo myLogInfo = new TableLogOnInfo();
string strPath = Server.MapPath("CrystalReport.rpt");

myReport.Load(strPath);
this.CrystalReportViewer1.ReportSource = myReport;

myLogInfo.ConnectionInfo.ServerName = "(local)";
myLogInfo.ConnectionInfo.DatabaseName = "Persons";
myLogInfo.ConnectionInfo.UserID = "sa";
myLogInfo.ConnectionInfo.Password = "123456";
myReport.Database.Tables[0].ApplyLogOnInfo(myLogInfo);


myReport.PrintOptions.PrinterName = @"\\192.168.0.5\hp LaserJet 1000";
myReport.PrintToPrinter(1, false, 1, 3);

myReport = null;
myLogInfo = null;
}

/// <summary>
/// 报表排序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button3_Click(object sender, EventArgs e)
{
ConfigueCrystalReport();
this.CrystalReportViewer1.ReportSource = myReport;
}

/// <summary>
/// 获得要排序的字段
/// </summary>
/// <param name="strFieldName"></param>
private void GetFieldName(string strFieldName)
{
try
{
FieldDefinition FieldDef = null;

FieldDef = myReport.Database.Tables[0].Fields[strFieldName];//把从“数据库”中取的该字段赋给 FieldDef

myReport.DataDefinition.SortFields[0].Field = FieldDef;//然后再赋给要排序的字段名称

if (m_FlagOrder == false)
{

myReport.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.AscendingOrder;
m_FlagOrder = true;
}
else
{
myReport.DataDefinition.SortFields[0].SortDirection = CrystalDecisions.Shared.SortDirection.DescendingOrder;

m_FlagOrder = false;
}
this.CrystalReportViewer1.ReportSource = myReport;
this.CrystalReportViewer1.ShowLastPage(); //获取页数
this.CrystalReportViewer1.ShowFirstPage();
}
catch (Exception ee)
{
Response.Write("<b><font color='#FF0000'>Operate Error!</font></b>");
}
}


}
这样弄没什么反应啊~!http://localhost:2059/WebSite1/CrystalReport.aspx?PerId=Location 这是URL地址。
flydragon0815 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 jwy0126 的回复:]
Location是什么东西啊,看不到图片啊
[/Quote]

csdn把空间相册关闭了,估计过一段时间就能开放
加载更多回复(82)

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧