DEV-打印设计

示例模版:

说明:pageheader跟pageFooter每页都会显示数据

 

barcode二维码设置

数据绑定

 

      public XtraReport1(DataSet dsSheet, DataSet dsDetail)
        {
            InitializeComponent();     

            this.PrintingSystem.ShowMarginsWarning = false;
            this.dsDetail = dsDetail;
            this.dsSheet = dsSheet;

            DataSet dsRep = new DataSet();

            DataTable dtSheet = dsSheet.Tables[0].Copy();
            dtSheet.TableName = "parent";
            dsRep.Tables.Add(dtSheet);

            DataTable dtDetail = dsDetail.Tables[0].Copy();
            dtDetail.TableName = "child";
            dsRep.Tables.Add(dtDetail);

            //设置主表和从表的父子关系
            DataColumn parentColumn = dsRep.Tables["parent"].Columns["ID"];
            DataColumn childColumn = dsRep.Tables["child"].Columns["ID"];
            DataRelation R1 = new DataRelation("R1", parentColumn, childColumn);
            dsRep.Relations.Add(R1);
            //绑定主表的数据源
            this.DataMember = "parent";
            this.DataSource = dsRep;
            //绑定明细表的数据源
            this.DetailReport.DataMember = "R1";
            this.DetailReport.DataSource = dsRep;
            //this.DetailReport.dat

            //  this.DataSource = dsRep ;
            BindHeadData(dsRep);
            BindBodyData(dsRep);

            //在页脚之后设置分页符
            GroupFooter1.PageBreak = PageBreak.AfterBand;

        }

 private void BindHeadData(DataSet ds)
        {

            //为XRLable绑定数据集及对应的字段

           // this.barCodeControl1.DataBindings.Add("Text", ds, "单据行条码");    不知道为何条码不能用这种方式绑定

            barCodeControl1.Text = ds.Tables[0].Rows[0]["单据行条码"] + ""; //条码绑定方式 存在问题
            this.xr生产单号.DataBindings.Add("Text", ds, "生产单号");//单元格 标签绑定方式

            this.xrPictureBox1.DataBindings.Add("Image", ds, "图纸");//图片绑定方式
        }

      private void BindBodyData(DataSet ds)
        {
            this.d子件编码.DataBindings.Add("Text", ds, "R1.子件编码");
        }

   private void xrpage_PrintOnPage(object sender, PrintOnPageEventArgs e)
        {

//添加标签控件 在标签控件事件PrintOnPage里面增加下面的方法 可以获得页码
            xrpage.Text = (e.PageIndex + 1).ToString() + "/" + e.PageCount.ToString();//当前页码/总页数
        }

以上打印模版设计完成

打印方法(单个)

  XtraReport1 report2 = new XtraReport1(ds, ds1);

 report2.Print(); //直接打印
 report2.ShowPreview();//打印预览

打印方法(批量) 2种方法

1.循环

                              XtraReport1 report1 = null;

for{

                               if (report1 == null)
                                {
                                    report1 = new XtraReport1(ds, ds1);
                                    report1.CreateDocument();
                                }
                                else
                                {
                                    XtraReport1 report2 = new XtraReport1(ds, ds1);
                                    report2.CreateDocument();
                                    report1.Pages.AddRange(report2.Pages);
                                }

                        report1.PrintingSystem.ContinuousPageNumbering = true;
                        ReportPrintTool printTool = new ReportPrintTool(report1);
                        printTool.ShowPreviewDialog();

2.略

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DevExpress打印相关代码 using System; using System.Windows.Forms; using DevExpress.XtraPrinting; using System.Xml.Serialization; namespace MyDevExpressDemo { /// /// PrintSettingController 的摘要说明。 /// public class PrintSettingController { PrintingSystem ps = null; string formName=null; DevExpress.XtraPrinting.PrintableComponentLink link=null; /// /// /// /// 要打印的部件 /// 此部件对应的布局信息 public PrintSettingController(IPrintable control,string FormName) { formName=FormName; ps=new DevExpress.XtraPrinting.PrintingSystem(); link=new DevExpress.XtraPrinting.PrintableComponentLink(ps); ps.Links.Add(link); link.Component=control; ps.PageSettingsChanged-=new EventHandler(ps_PageSettingsChanged); LoadPageSetting(); ps.PageSettingsChanged+=new EventHandler(ps_PageSettingsChanged); ps.AfterMarginsChange+=new MarginsChangeEventHandler(ps_AfterMarginsChange); } public void Preview() { try { if(DevExpress.XtraPrinting.PrintHelper.IsPrintingAvailable) { Cursor.Current=Cursors.AppStarting; if(_PrintHeader!=null) { PageHeaderFooter phf = link.PageHeaderFooter as PageHeaderFooter; phf.Header.Content.Clear(); phf.Header.Content.AddRange(new string[] {"",_PrintHeader,""}); phf.Header.Font=new System.Drawing.Font("宋体",14,System.Drawing.FontStyle.Bold); phf.Header.LineAlignment=BrickAlignment.Center; } link.PaperKind=ps.PageSettings.PaperKind; link.Margins=ps.PageSettings.Margins; link.Landscape=ps.PageSettings.Landscape; link.CreateDocument(); ps.PreviewForm.Show(); } else { Cursor.Current=Cursors.Default; MessageBox.Show("打印机不可用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } finally { Cursor.Current=Cursors.Default; } } /// /// 打印控制器 /// /// 要打印的部件 public PrintSettingController(IPrintable control) { if(control==null)return; Control c=(Control)control; formName=c.FindForm().GetType().FullName+"."+c.Name; ps=new DevExpress.XtraPrinting.PrintingSystem(); link=new DevExpress.XtraPrinting.PrintableComponentLink(ps); ps.Links.Add(link); link.Component=control; ps.PageSettingsChanged-=new EventHandler(ps_PageSettingsChanged); LoadPageSetting(); ps.PageSettingsChanged+=new EventHandler(ps_PageSettingsChanged); ps.AfterMarginsChange+=new MarginsChangeEventHandler(ps_AfterMarginsChange); } public void ExportToHtml() { try { using(SaveFileDialog fd=new SaveFileDialog()) { fd.Title="导出HTML文件"; fd.RestoreDirectory=true; fd.Filter="HTML文件|*.htm"; fd.FilterIndex=1; if(fd.ShowDialog()==DialogResult.OK) { // if(obj is DevExpress.XtraGrid.GridControl) // { // ((DevExpress.XtraGrid.GridControl)obj).ExportToHtml(fd.FileName); // MessageBox.Show("文件导出成功","导出",MessageBoxButtons.OK,MessageBoxIcon.Information); // } // else if(obj is DevExpress.XtraTreeList.TreeList) // { link.CreateDocument(); ps.ExportToHtml(fd.FileName); MessageBox.Show("文件导出成功","导出",MessageBoxButtons.OK,MessageBoxIcon.Information); // } } } } finally { } } /// /// 网格分组时要导出,请使用这个, /// public void GridGroupToExcel() { DevExpress.XtraGrid.GridControl grid=this.link.Component as DevExpress.XtraGrid.GridControl; if(grid!=null) { using(SaveFileDialog fd=new SaveFileDialog()) { fd.Title="导出Excel文件"; fd.RestoreDirectory=true; fd.Filter="Excel文件|*.xls"; fd.FilterIndex=1; if(fd.ShowDialog()==DialogResult.OK) { grid.ExportToExcel(fd.FileName); MessageBox.Show("文件导出成功","导出",MessageBoxButtons.OK,MessageBoxIcon.Information); } } } } public void ExportToExcel() { try { using(SaveFileDialog fd=new SaveFileDialog()) { fd.Title="导出Excel文件"; fd.RestoreDirectory=true; fd.Filter="Excel文件|*.xls"; fd.FilterIndex=1; if(fd.ShowDialog()==DialogResult.OK) { // if(obj is DevExpress.XtraGrid.GridControl) // { // ((DevExpress.XtraGrid.GridControl)obj).ExportToExcel(fd.FileName); // MessageBox.Show("文件导出成功","导出",MessageBoxButtons.OK,MessageBoxIcon.Information); // } // else if(obj is DevExpress.XtraTreeList.TreeList) // { link.CreateDocument(); ps.ExportToXls(fd.FileName); MessageBox.Show("文件导出成功","导出",MessageBoxButtons.OK,MessageBoxIcon.Information); // } } } } finally { } } string _PrintHeader=null; /// /// 打印时的标题 /// public string PrintHeader { set { _PrintHeader=value; } } /// /// 进行打印 /// public void Print() { try { if(DevExpress.XtraPrinting.PrintHelper.IsPrintingAvailable) { if(_PrintHeader!=null) { PageHeaderFooter phf = link.PageHeaderFooter as PageHeaderFooter; phf.Header.Content.Clear(); phf.Header.Content.AddRange(new string[] {"",_PrintHeader,""}); phf.Header.Font=new System.Drawing.Font("宋体",14,System.Drawing.FontStyle.Bold); phf.Header.LineAlignment=BrickAlignment.Center; } link.PaperKind=ps.PageSettings.PaperKind; link.Margins=ps.PageSettings.Margins; link.Landscape=ps.PageSettings.Landscape; link.CreateDocument(); link.CreateDocument(); ps.Print(); } else { Cursor.Current=Cursors.Default; MessageBox.Show("打印机不可用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } finally { } } private void ps_AfterMarginsChange(object sender, MarginsChangeEventArgs e) { SavePageSetting(); } private void ps_PageSettingsChanged(object sender, EventArgs e) { SavePageSetting(); } //获取页面设置信息 void LoadPageSetting() { try { string path=System.Windows.Forms.Application.StartupPath+"\\PrintLayout"; if(!System.IO.Directory.Exists(path)) { return; } path+="\\"+formName+".xml"; if(!System.IO.File.Exists(path)) { return; } XmlSerializer ser=new XmlSerializer(typeof(UserPageSetting)); UserPageSetting setting=(UserPageSetting)ser.Deserialize(new System.IO.FileStream(path,System.IO.FileMode.Open,System.IO.FileAccess.Read,System.IO.FileShare.ReadWrite)); System.Drawing.Printing.Margins m=new System.Drawing.Printing.Margins(setting.Left,setting.Right,setting.Top,setting.Bottom); ps.PageSettings.Assign(m,(System.Drawing.Printing.PaperKind)setting.PaperKind,setting.Landscape); } catch{} } /// /// 保存当前网格的布局 /// void SavePageSetting() { try { string path=System.Windows.Forms.Application.StartupPath+"\\PrintLayout"; if(!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } path+="\\"+formName+".xml"; DevExpress.XtraPrinting.XtraPageSettings setting= ps.PageSettings; UserPageSetting s=new UserPageSetting(); s.Landscape=setting.Landscape; s.Left=setting.Margins.Left; s.Right=setting.Margins.Right; s.Top=setting.Margins.Top; s.Bottom=setting.Margins.Bottom; s.PaperKind=(int)setting.PaperKind; XmlSerializer ser=new XmlSerializer(s.GetType()); ser.Serialize(new System.IO.FileStream(path,System.IO.FileMode.Create,System.IO.FileAccess.Write,System.IO.FileShare.ReadWrite),s); } catch{} } } /// /// 最终用户对某个打印页的设置 /// [Serializable()] public class UserPageSetting { public UserPageSetting() { } public bool Landscape; public int PaperKind; public int Top; public int Bottom; public int Left; public int Right; } }
### 回答1: 好的,我明白了。对于您的问题,我可以回答。 以下是求结点值小于结点平均值的结点个数的算法和函数实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int value; struct Node *next; } Node; int countNodesBelowAvg(Node *head) { if (head == NULL || head->next == NULL) { return 0; } int count = 0; int sum = 0; Node *p = head->next; while (p != NULL) { sum += p->value; p = p->next; } float avg = (float) sum / countNodes(head); p = head->next; while (p != NULL) { if (p->value < avg) { count++; } p = p->next; } return count; } int countNodes(Node *head) { int count = 0; Node *p = head->next; while (p != NULL) { count++; p = p->next; } return count; } int main() { // 构造链表 Node *head = (Node *) malloc(sizeof(Node)); head->next = NULL; Node *tail = head; int n = 0; printf("请输入链表的整数个数:"); scanf("%d", &n); printf("请输入链表的整数:"); for (int i = 0; i < n; i++) { int x = 0; scanf("%d", &x); Node *node = (Node *) malloc(sizeof(Node)); node->value = x; node->next = NULL; tail->next = node; tail = node; } // 调用函数 int count = countNodesBelowAvg(head); printf("结点值小于结点平均值的结点个数为:%d\n", count); // 释放链表空间 Node *p = head; while (p != NULL) { Node *q = p; p = p->next; free(q); } return 0; } ``` 这个程序会要求用户输入链表的整数个数和整数值,并根据这些数据构造链表。然后它会调用 `countNodesBelowAvg` 函数来求结点值小于结点平均值的结点个数,并将结果打印出来。最后,它会释放链表空间,避免内存泄漏。 希望这个回答能够帮助到您! ### 回答2: 要实现这个功能,可以按以下步骤进行: 1. 定义链表节点结构体,包含一个整数值和指向下一个节点的指针。 2. 在主函数创建带头结点的单链表,并读取一组整数,依次将它们插入到链表。 3. 遍历整个链表,计算节点的总个数和所有节点值的总和。 4. 计算节点的平均值,并初始化计数器count为0。 5. 再次遍历链表,对每个节点的值与平均值进行比较,若小于平均值,count加1。 6. 返回count作为函数的结果,输出结果。 下面是一个完整的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建链表节点 Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; return newNode; } // 插入节点到链表尾部 void insertNode(Node* head, int value) { Node* newNode = createNode(value); Node* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } // 计算结点值小于结点平均值的结点个数 int countNodes(Node* head) { // 计算结点总个数和所有结点值的总和 int totalNodes = 0; int sum = 0; Node* curr = head->next; while (curr != NULL) { totalNodes++; sum += curr->data; curr = curr->next; } // 计算结点的平均值 double avg = (double)sum / totalNodes; // 统计结点值小于平均值的结点个数 int count = 0; curr = head->next; while (curr != NULL) { if (curr->data < avg) { count++; } curr = curr->next; } return count; } int main() { // 创建带头结点的单链表 Node* head = createNode(0); // 读取一组整数,插入到链表 int n; printf("请输入整数个数:"); scanf("%d", &n); printf("请输入%d个整数:", n); for (int i = 0; i < n; i++) { int value; scanf("%d", &value); insertNode(head, value); } // 计算结点值小于结点平均值的结点个数 int result = countNodes(head); // 输出结果 printf("结点值小于结点平均值的结点个数:%d\n", result); return 0; } ``` 这个程序将通过函数返回值返回结点值小于结点平均值的结点个数,并在屏幕上输出结果。注意,这里假设输入的整数都是合法的,并且不考虑链表的释放内存操作。 ### 回答3: 下面是一个通过计算结点值小于结点平均值的结点个数并通过函数值返回结果的算法: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int data; struct ListNode* next; } ListNode; int countNodesLessThanAverage(ListNode *head) { if (head == NULL || head->next == NULL) { // 链表为空或只有一个结点的情况下,返回0 return 0; } int sum = 0; int count = 0; ListNode* current = head->next; // 计算链表所有结点的和 while (current != NULL) { sum += current->data; count++; current = current->next; } int average = sum / count; // 平均值 // 计算结点值小于平均值的结点个数 count = 0; current = head->next; while (current != NULL) { if (current->data < average) { count++; } current = current->next; } return count; } int main() { // 创建带头结点的单链表 ListNode* head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; ListNode* tail = head; // 在链表尾部插入一段整数 int nums[] = {2, 3, 5, 1, 4}; int length = sizeof(nums) / sizeof(nums[0]); for (int i = 0; i < length; i++) { ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->data = nums[i]; node->next = NULL; tail->next = node; tail = node; } int result = countNodesLessThanAverage(head); printf("结点值小于结点平均值的结点个数:%d\n", result); // 释放内存 ListNode* current = head; while (current != NULL) { ListNode* temp = current; current = current->next; free(temp); } return 0; } ``` 以上代码定义了一个链表结构 `typedef struct ListNode`,包含数据域 `int data` 和指向下一个结点的指针 `struct ListNode* next`。定义了一个 `countNodesLessThanAverage` 函数,该函数接受一个带头结点的单链表 `head`,计算结点值小于结点平均值的结点个数并通过函数值返回结果。 在 `main` 函数,首先创建一个带头结点的单链表,并插入一段整数。然后调用 `countNodesLessThanAverage` 函数获取结果,并打印到控制台。最后释放链表的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值