水晶报表打印

1.数据源的使用,当从外部添加数据库文件或更新数据库文件时,可以直接将解决方案中的数据库文件替换掉,但是如果程序设计界面中用到了数据绑定,涉及到了数据源的话,如果要将数据源中的内容也更新的话,可以从服务器资源管理器中直接拖过来。(我太傻了,以前都不知道)

2.为报表绑定数据集

3.在报表中如果用到了某一个数据库中的多个表。为一个报表填充某一个数据集时,可以设置将多个表填充到数据集中,然后再将数据集填充给报表。

//填充数据集
detialListTableAdapter1.Fill(sendProductDataSet1.DetialList,hadRows);
sendTotalListTableAdapter1.Fill(sendProductDataSet1.SendTotalList,hadRows);

#region 判断记录是否够7行,如果不够,加空白行;

int currentRecordCount = sendProductDataSet1.DetialList.Rows.Count;
if (currentRecordCount < recordCount)
{
int jj = recordCount - currentRecordCount;
for (int i = 0; i < jj; i++)
{
DataRow dr = sendProductDataSet1.DetialList.NewRow();
sendProductDataSet1.DetialList.Rows.Add(dr);
}
}

#endregion
#region 创建报表实例
CrystalReportSend sendReport = new CrystalReportSend();
sendReport.SetDataSource(sendProductDataSet1);
ReportDocument document = (ReportDocument)sendReport;
this.crystalReportViewer1.ReportSource = document;
#endregion

4.水晶报表中设计

  在页眉和页尾中的设置基本上没什么特殊的地方,如果想要在这两个地方显示什么内容,就将自己新加的字段或数据库字段放在此处即可正常显示。

  而在详细信息部分添加的内容则需要注意了,如果报表体中有多行内容格式相同,在这里只需要设计一行即可,在运行时,程序会根据填充的数据集按设置的报表详细信息中个格式依次显示,而不需要在设计时就画出多行。

5.使用的小函数

strSum = strSum.PadLeft(9, ' ');该函数为字符串的操作,如果字符转长度不够9为,在左边用空格填充。

string.Format("{0:F2}", totalSum);将数字保存为字符串,并且保留两位小数

6.为报表添加临时数据集,而不是填充数据库的数据集

DataRow tdr = sendProductDataSet1.SendTotalList.AddSendTotalListRow(,,,,);AddSendTotalListRow为自动生成的对应数据库中表名的方法,其参数为对应数据库中各个字段的具体的值。

注意:虽然可以为水晶报表填充临时的数据集,但是还要通过数据集这个中间的部分,填充后,如果临时数据集中的内容可能会回传到数据库中,所以还要清空一下。清空可以清空整个数据集,也可以清空指定的表,这里我清空了两个表

 sendProductDataSet1.DetialList.Clear();
 sendProductDataSet1.SendTotalList.Clear();

因为整个程序中用到的数据集都是同一个,在其他的地方可能会用到某个表绑定到某个控件,清空整个数据集会出错,还是用到哪个清空那个。

水晶报表在显示时,会将详细部分内容重复7次(这个不确定,有可能是根据详细部分设计窗格的高度自动调整的),如果数据集中数据不够7条,可以自己填充空白行

 DataRow dr = sendProductDataSet1.DetialList.NewRow();         
sendProductDataSet1.DetialList.Rows.Add(dr);

7.我的Windows程序写好之后有段时间一直是需要点击两下退出符号才可以退出,原来是在强制转换某个对象时,好象是没有判断是否为空、还是占用了什么资源导致的,解决办法是,占用的绑定表endEdit()在update一下。

8.关于datagridview

倒序删除datagridview中的内容

int rowsSelectCount = dataGridViewSend.SelectedRows.Count;

for (int i = rowsSelectCount; i >= 1; i--)//从下往上删,避免沙漏效应
{
dataGridViewSend.Rows.RemoveAt(dataGridViewSend.SelectedRows[i - 1].Index);
}

注意:datagridview的clear方法,这个虽说清空了内容,但只是我们看不到了,实际上还在,要用removeAt依次删除。

原文地址:https://www.cnblogs.com/mebius4789/p/Crystal_print.html