Keresés

Új hozzászólás Aktív témák

  • NoMan

    csendes tag

    válasz drkbl #4174 üzenetére

    Hát igen nagyjából ez! Csak annyi hogy én ezt kiheréltem ki kicsit.

    És, hogyan tudom én mindezt a memóriában végrehajtani? Mert tényleg nagyon zavaró ez a 5-7mp, amíg történik valami. Ezzel a programmal emberek dolgoznak és az én anyám szidjak, hogy mit tököl ez a sz...r program. :( Egyszóval közellenség vagyok, így ezt valahol meg kell oldanom.

    Van valakinek ötlete?

  • NoMan

    csendes tag

    válasz drkbl #4171 üzenetére

    Pontosan ez a gondom, hogy a számlázó programom például, kattintás után kb 1 mp múlva már nyomtat. Tehát itt valami a renderrel lesz, vagy valamit rosszul csináltam, vagy egy bug, vagy nem tudom... Sajnos ötletem sincs :(

  • NoMan

    csendes tag

    válasz drkbl #4169 üzenetére

    Akkor is legalább 3mp a render idő, ha csak egy label elem van az rdclen, amibe beleírtam egy szöveget. Tehát teljesen adatfüggetlen nyomtatási kép esetén is lassú a render idő.

    Így hívom meg az osztályt:

    LocalReport report = new LocalReport();
    report.ReportEmbeddedResource = "<rdcl neve>.rdlc";

    Report_DataSet dataSet = new Report_DataSet();
    DataTable dataTable = dataSet.dataGridView_List;
    DataRow dataRow = null;

    foreach (DataGridViewRow row in dataGridViewProductList.Rows)
    {
    dataRow = dataTable.NewRow();

    dataRow["productId"] = ((row.Cells["colProductId"].Value != null) ? row.Cells["colProductId"].Value.ToString() : "");
    dataRow["productName"] = ((row.Cells["colProductName"].Value != null) ? row.Cells["colProductName"].Value.ToString() : "");
    dataRow["productCount"] = ((row.Cells["colProductCount"].Value != null) ? row.Cells["colProductCount"].Value.ToString() : "");

    dataTable.Rows.Add(dataRow);
    }

    report.DataSources.Add(new ReportDataSource("dataGridView_List", dataTable));

    using (Printer printer = new Printer())
    {
    printer.Run(report);
    }

  • NoMan

    csendes tag

    válasz drkbl #4167 üzenetére

    Ez is csak annyit mutatott, mint amit eddig is tudtam, hogy a render hívás iszonyatosan lassú.

  • NoMan

    csendes tag

    Sziasztok,

    Az alábbi osztály (MSDN-ről szedtem) segítségével kezdeményezem az elkészített, feltöltött RDLC nyomtatását Visual Studio 2012-ban. A gondom ezzel az, hogy az Export metódus report.render hívása 5 másodpercig is elszórakozik, mire elkészül, és valóban megkezdődik a nyomtatás, még abban az esetben is, ha csak 1 sornyi adatot kell rendelni és nyomtatni. Mitől lehet lassú ez a folyamat? Hogyan lehet ez gyorsítani? Előre is köszönöm a segítséget!

    public class Printer : IDisposable
    {
    private int m_currentPageIndex;
    private IList<Stream> m_streams;

    // Routine to provide to the report renderer, in order to
    // save an image for each page of the report.
    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
    {
    Stream stream = new FileStream(@"..\..\" + name + "." + fileNameExtension, FileMode.Create);
    m_streams.Add(stream);

    return stream;
    }

    // Export the given report as an EMF (Enhanced Metafile) file.
    private void Export(LocalReport report)
    {
    string deviceInfo =
    "<DeviceInfo>" +
    " <OutputFormat>EMF</OutputFormat>" +
    " <PageWidth>8.5in</PageWidth>" +
    " <PageHeight>11in</PageHeight>" +
    " <MarginTop>0.25in</MarginTop>" +
    " <MarginLeft>0.25in</MarginLeft>" +
    " <MarginRight>0.25in</MarginRight>" +
    " <MarginBottom>0.25in</MarginBottom>" +
    "</DeviceInfo>";

    Warning[] warnings;
    m_streams = new List<Stream>();

    report.Render("Image", deviceInfo, CreateStream, out warnings);
    foreach (Stream stream in m_streams)
    stream.Position = 0;
    }

    // Handler for PrintPageEvents
    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
    Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
    ev.Graphics.DrawImage(pageImage, ev.PageBounds);

    m_currentPageIndex++;
    ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    }

    private void Print()
    {
    PrinterSettings printerSettings = new PrinterSettings();

    //string printerName = printerSettings.PrinterName;
    const string printerName = "Microsoft XPS Document Writer";

    if (m_streams == null || m_streams.Count == 0) return;

    PrintDocument printDoc = new PrintDocument();
    printDoc.PrinterSettings.PrinterName = printerName;
    if (!printDoc.PrinterSettings.IsValid)
    {
    string msg = String.Format("Can't find printer \"{0}\".", printerName);

    MessageBox.Show(msg, "Print Error");

    return;
    }
    printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
    printDoc.Print();
    }

    // Create a local report for Report.rdlc, load the data,
    // export the report to an .emf file, and print it.
    public void Run(LocalReport report)
    {
    Export(report);

    m_currentPageIndex = 0;
    Print();
    }

    public void Dispose()
    {
    if (m_streams != null)
    {
    foreach (Stream stream in m_streams)
    stream.Close();

    m_streams = null;
    }
    }
    }

  • NoMan

    csendes tag

    válasz sztanozs #4125 üzenetére

    Ezt értem, de az itt bemutatott példa a dataset-et futás időben tölti fel, így hogy adom hozzá az rdlc-hez, hogy azt utána fel tudjam tenni a mezőket a nyomtatási képre?

  • NoMan

    csendes tag

    Sziasztok,

    Nyomtatási képet szeretnék készíteni (rdlc) Visual Studioba. Arra már rájöttem, hogy a solutionhoz hozzá lehet adni egy report elemet, amiben meg lehet szépen vizuálisan tervezni a nyomtatási képet. A probléma nem is itt van, mert ez megy, repertview komponensbe meg is tudom jeleníteni.

    Ezzel eddig nincs gond. Viszont azt már nem tudom megoldani, hogy a programból érkező adatokat meg tudjak jeleníteni. Neten olvasgatva DataSet-et kell hozzá adnom, melynek a mezőit fel tudom húzni a report layout-ra, viszont minden példa MSSQL adatbázisból egy lekérdezésen keresztül gyűjtötte ki az adatokat. Nekem viszont az adatok postgresql-ből jönnek, így viszont nem tudom, hogy hogyan építem fel a dataset-et és azt hogyan adom át a report-nak (rdlc-nek).

    Valaki tudna nekem ebben segíteni, hogy ez pontosan hogyan is működik, hogyan tudok ebben elindulni.

    A segítséget előre is köszönöm.

  • NoMan

    csendes tag

    válasz sztanozs #4061 üzenetére

    Köszönöm szépen... Azt, hogy miért csinálja így azt sejtettem, bár nem volt teljesen pontos az elképzelésem, de majdnem így képzeltem én is. Viszont a megoldásra nem volt ötletem. Remélem a linkből kiderül az is ;)

  • NoMan

    csendes tag

    Kedves Fórumozók!

    A következő problémával fordulnék hozzátok. Már 1 napja a google-t bújom, de igazi megoldást még nem találtam a következő problémára: Adott egy DLL fájl, benne egy formmal.

    Ebből a DLL-ből kellene betölteni a Formot (erre már találtam több megoldást is), viszont van egy kis csavar a dologban (erre nem találtam megoldást). A példányosítás előtt ellenőrizni kéne, hogy futás közben változott-e a DLL és ha igen, akkor újra kéne tölteni a DLL-t és úgy példányosítani.

    Ez azért lenne fontos, mert a főprogramból egy példány fut és az nem zárható be / nem indítható újra. Viszont a DLL-ben megvalósítottt formon időnként változtatnom kell. Melyet úgy szeretnék megoldani, hogy kicserélem a főprogram alatt a DLL fájlokat és amikor újra azt a Formot szeretné a főprogi betölteni, akkor már az új, megváltoztatott változat töltődik be.

    Ezzel a módszerrel próbálkoztam:

    Assembly assembly = Assembly.LoadFile(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "dashboardBasic.dll");
    Type type = assembly.GetType("dashboardBasic.FormDashboardBasic");
    Form form = (Form)Activator.CreateInstance(type);
    form.MdiParent = this;
    form.Show();

    Ez betöltötte a DLL-t és az alapján meg is jelenítette az űrlapot, de ha kicseréltem a DLL-t, akkor a régi űrlapot nyitotta meg, egészen addig, amíg a főprogit újra nem indítottam.

    Egy másik megoldás, de ez szintén ugyan ezen ok miatt zsákutca volt:

    AppDomain TestDomain = AppDomain.CreateDomain("dashboardBasic");
    Assembly testDLL = TestDomain.Load(AssemblyName.GetAssemblyName(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "dashboardBasic.dll"));
    Type type = testDLL.GetType("dashboardBasic.FormDashboardBasic");
    Form form = (Form)Activator.CreateInstance(type);
    form.MdiParent = this;
    form.Show();
    AppDomain.Unload(TestDomain);

    Valakinek valami jó ötlete a probléma megoldására?
    Előre is köszönöm az építő jellegű hozzászólásokat.

Új hozzászólás Aktív témák

Hirdetés