none
rdlc直接打印时发生错误。 RRS feed

  • 问题

  • <%@ Page Language="C#" AutoEventWireup="true" CodeFile="材料入库单打印.aspx.cs" Inherits="仓库_材料入库单打印" MasterPageFile="~/MasterPage2.master" Title="材料入库单打印" %>
    
    <%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        <div>
        
            <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
                DataSourceID="SqlDataSource1" DataTextField="单号" DataValueField="单号" 
                onselectedindexchanged="DropDownList1_SelectedIndexChanged">
            </asp:DropDownList>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="打印" />
            &nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Label ID="Label1" runat="server" ForeColor="#CC3300" Text="已打印0次,这是第1次打印!"></asp:Label>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
                SelectCommand="SELECT DISTINCT [单号] FROM [来料检验通知单] ORDER BY [单号] DESC"></asp:SqlDataSource>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
        
            <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" 
                Font-Size="8pt" Height="619px" InteractiveDeviceInfos="(集合)" 
                WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" Width="982px" 
                ShowPrintButton="False">
                <LocalReport ReportPath="仓库\Report2.rdlc">
                    <DataSources>
                        <rsweb:ReportDataSource DataSourceId="SqlDataSource2" Name="DataSet1" />
                    </DataSources>
                </LocalReport>
            </rsweb:ReportViewer>
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
                SelectCommand="SELECT * FROM [来料检验通知单]"></asp:SqlDataSource>
        
        </div>
       </asp:Content>
    

    protected void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection sqlcon = new SqlConnection();
            sqlcon.ConnectionString = ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString;
            sqlcon.Open();
    
            string sql10 = string.Format("select * from 来料检验通知单 where 单号='" + DropDownList1.SelectedValue + "'");
    
            SqlDataAdapter myda = new SqlDataAdapter(sql10, sqlcon);
            System.Data.DataTable ds = new System.Data.DataTable();
            myda.Fill(ds);
    
            LocalReport report = ReportViewer1.LocalReport;
            report.DataSources.Clear();
    
            report.ReportPath = "仓库\\Report2.rdlc";
            report.DataSources.Add(new ReportDataSource("DataSet1", ds));
            //Step 2: 将报表的内容输出为指定格式的数据流。
       string deviceInfo =
         "" +
         "  EMF" +
         "  14.732cm" +
         "  24.13cm" +
         "  0.25cm" +
         "  0cm" +
         "  0cm" +
         "  0cm" +
         "";
            Warning[] warnings;
       //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
            report.Render("Image", deviceInfo, CreateStream, out warnings);
            sqlcon.Close();
        }
    
            /*
            这里使用LocalReport对象的Render方法,将报表的内容输出到指定的数据流(Stream)中
                。Render方法的第一个参数指定输出的流的格式
                ,这里指定为Image格式(图形格式)
            ;第二个参数为一个XML格式的字符串
                ,用来描述输出格式的详细信息
                ;第三个参数是一个回调函数(CreateStreamCallback委托类型)
            ,你需要为这个参数声明一个函数
                ,Render方法会将报表的内容输出到这个函数返回的Stream对象的实例中
                ,这个函数看上去类似下面的声明
            */
       //声明一个Stream对象的列表用来保存报表的输出数据
       //LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
       private List<Stream> m_streams;
       //用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
       private Stream CreateStream(string name, string fileNameExtension,
         Encoding encoding, string mimeType, bool willSeek)
       {
           //如果需要将报表输出的数据保存为文件,请使用FileStream对象。
           Stream stream = new MemoryStream();
           m_streams.Add(stream);
           return stream;
       }
      //你可以使用这个函数的参数执行更多的操作,具体内容请参考CreateStreamCallback委托。
      //第四个参数用来输出报表处理过程中产生的警告信息。
        //Step 3: 使用PrintDocument对象执行打印操作。
       //用来记录当前打印到第几页了
       private int m_currentPageIndex;
       private void Print()
      {
           m_currentPageIndex = 0;
           if (m_streams == null ||m_streams.Count == 0)
               return;
           //声明PrintDocument对象用于数据的打印
           PrintDocument printDoc = new PrintDocument();
           //指定需要使用的打印机的名称,使用空字符串”“来指定默认打印机
           printDoc.PrinterSettings.PrinterName= "";
           //判断指定的打印机是否可用
           if(!printDoc.PrinterSettings.IsValid)
          {
              MessageBox.Show("Can't find printer");
               return;
           }
          //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。
           printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
           //执行打印操作,Print方法将触发PrintPage事件。
           printDoc.Print();
       }
      //具体的PrintPage事件处理程序如下:
         private void PrintPage(object sender, PrintPageEventArgs ev)
       {
           //Metafile对象用来保存EMF或WMF格式的图形,
           //我们在前面将报表的内容输出为EMF图形格式的数据流。
            m_streams[m_currentPageIndex].Position = 0;        
             Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
           //指定是否横向打印
           ev.PageSettings.Landscape = false;
           //这里的Graphics对象实际指向了打印机
           ev.Graphics.DrawImage(pageImage, 0,0);
          m_streams[m_currentPageIndex].Close();
           m_currentPageIndex++;
           //设置是否需要继续打印
           ev.HasMorePages = (m_currentPageIndex< m_streams.Count);
       }
      //到此,我们的报表数据就已经打印出来了,在这个过程中,你可以根据需要添加自己的打印逻辑。
    }

    2012年3月21日 9:19

全部回复

  • 在模仿网上的代码时发生了这个错误。

    不知各位有没有什么实例吗,如果有的话,麻烦给我链接。

    2012年3月21日 9:20