Есть ли способ напечатать или передать результаты DataGridView в приложении C # WinForms? - PullRequest
0 голосов
/ 12 июня 2019

Я создал калькулятор плана платежей, специфичный для отрасли, в которой я работаю. Наконец-то я получил весь код для правильного выполнения и загрузки плана платежей для заполнения в сетке данных.

Мне нужна сетка данных (а также некоторая другая информация) для физической печати нашего локального принтера, в PDF или, по крайней мере, для повторного заполнения другой формы.

Идея состоит в том, чтобы не допустить, чтобы мои сотрудники заполняли информацию вручную на бумаге после расчета схемы оплаты.

После того, как все сделано, сетка данных показывает даты и суммы каждого платежа в строковом формате.

У меня есть 2 формы.

MainInterface.cs - полный калькулятор в одном «приложении на одной странице» Здесь заполняется сетка данных с планом платежей Это содержит весь мой код и функциональный интерфейс

AutoPay.cs - Визуальное представление «отчета», который я пытаюсь распечатать. Это появляется, если пользователь нажимает на Экспорт на панели инструментов. Здесь ничего не закодировано. Это просто панель, dataGridView и несколько текстовых полей для дополнительной «пользовательской» информации, которая будет добавлена ​​перед отправкой данных в PDF или на принтер (например: «Запуск в 7 вечера»)

ВСЕ мой код и функциональный интерфейс прямо сейчас находятся в MainInterface.cs.

Я придерживаюсь этого подхода, потому что несколько раз мне не удавалось заставить работать средства просмотра Windows и Crystal Report. На данный момент я просто ищу функционал и почти готов просто сказать им, чтобы они сделали скриншот приложения и распечатали скриншот (не идеально).

Думаю, я только что добавил зависимости и / или библиотеки, которые на самом деле не нужны моему приложению.

У меня есть более 2000 строк кода в MainInterface.cs (я довольно новичок во всем этом, и я доберусь до изучения структур Class / Scope, как только у меня это получится).

Если это уместно, вот операторы using и информация о пространстве имен:

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PaymentPlanCalculator
{
public partial class paymentPlanCalculator : Form
{ //My entire app (MainInterface.cs is in here)

Вот как заполняется сетка данных: -Даты рассчитаны -Счета рассчитываются -Количество платежей и некоторые основные математические алгоритмы рассчитывают платежи для различных ситуаций

    public void CreateInstallmentDates(int payCycle)
        {
            //int payCycle; // Initialize Integer for PayCycle Days
            int numberOfPayments = Convert.ToInt16(lblTotalPaymentCount.Text); // Set number of payments
            DateTime downPaymentDate = monthCalendarDP.SelectionStart;
            DateTime[] paymentPlanDates = new DateTime[numberOfPayments];
            //DateTime[] paymentPlanDates = new DateTime[numberOfPayments];
            paymentPlanDates[0] = downPaymentDate;

    //This repeats 11 more times, each with 1 'payment' removed
    //This is how the payment dates are calculated:
            if (Convert.ToInt16(lblTotalPaymentCount.Text) == 12)
            {
                DateTime firstInstallmentDate = monthCalendarInstallmentStart.SelectionStart;
                paymentPlanDates[1] = firstInstallmentDate; // 2 Payments
    }
    //...this repeats many more times
            }

Очевидно, что код похож на спагетти

    public void PopulateDataGrid() // THESE ALL NEED THE ADDRESSES TO ADD
        {
            dataGridPPA.Rows.Clear();
            CalculatePaymentDates(); // Call to calculate dates
            int numberOfPayments = Convert.ToInt16(lblTotalPaymentCount.Text);

//With Down Payment and PPA DP and PPA W/ or W/O SIF

if (txtDownPayment.Text != "0.00" && lblInstallmentAmt.Text != "0.00" && sliderRemainingPmtCount.Value > 1) // If PPA has down payment and PPA
            {
                dataGridPPA.Rows.Add(); // Add row
                dataGridPPA["pmtDate", 0].Value = monthCalendarDP.SelectionStart.ToShortDateString(); // Which date is selected (set it to a string)
                dataGridPPA["pmtAmount", 0].Value = String.Format("${0:00}", txtDownPayment.Text); // Take payment amount in Down Payment and add to grid
                // FILL THE INSTALLMENT PAYMENTS
                for (int ppaRow = 1; ppaRow < (numberOfPayments - 1); ppaRow++) // Select second row
                {
                    dataGridPPA.Rows.Add(); // Add row
                    dataGridPPA["pmtDate", ppaRow].Value = PPADates[ppaRow].ToShortDateString(); // Select Date from PPA Dates Array
                    dataGridPPA["pmtAmount", ppaRow].Value = lblInstallmentAmt.Text; // Set installment amount to sting
                }
                // FILL THE FINAL INSTALLMENT PAYMENT
                dataGridPPA.Rows.Add(); // Add final row // Error when not set to schedule - Likely Fixed
                dataGridPPA["pmtDate", numberOfPayments - 1].Value = PPADates[numberOfPayments - 1].ToShortDateString(); // Select Final Date from PPA Date Array
                dataGridPPA["pmtAmount", numberOfPayments - 1].Value = lblRemainder.Text; // Adds remainder amount (after date in previous row)
        }
    }

Весь этот код работает и делает то, что мне нужно, но, как вы видите, он грязный, поэтому мне нужно просто взять

dataGridPPA из MainInterface.cs и скопировать его в AutoPay.cs

OR

Если это все смешно, я могу попробовать метод «экспортировать в отчет» еще раз. Я просто не могу найти хороших учебников, в которых качество звука и акценты не мешают им следовать.

Думаю, у меня проблема с объемом. Если я попытаюсь просто сделать это:

dataGridPPA = exportPPAdataGrid 

или любая итерация чего-либо отдаленно похожего, intellisense, по сути, показывает мне, что я не могу читать данные из одной формы в другую, несмотря на то, что в обеих формах все открыто.

Я пытался вызвать классы и пространства имен, но мне не повезло.

Я попытался создать источник данных из dataGridPPA и перенести его таким образом, очевидно, я был над головой.

Я готов сделать все, что поможет мне доставить данные в нужное место и открыть для ЛЮБЫХ предложений. Чем проще или проще, тем лучше.

1 Ответ

0 голосов
/ 13 июня 2019

Есть несколько способов, некоторые из них являются общими:

1) Использование сервера отчетов / дизайнера - вы сказали, что он не работает для вас.Существует множество коммерческих решений, но все они нуждаются в более или менее требовательной реализации, прежде чем их можно будет использовать.Это стоит, когда вам нужно много разных печатных выходов и позволяет проектировать WYSIWYG.

2) Скомпилировать HTML (создать таблицу HTML из таблицы данных) и отобразить ее в компоненте WebBrowser (из коллекции по умолчанию)элементов управления .NET), из которого вы можете легко распечатать.Это не самый надежный способ, как для настройки страницы и тому подобное.Вероятно, самый быстрый и самый простой метод, подходящий для простых вещей.В этом примере кода печатается метка данного элемента:

C # (преобразовано):

Private void CreateAndShowItemLabel(Int64 ItemID)
{
    String typeText = this.ItemType.GetItemText(this.ItemType.SelectedItem);
    String ContType = Strings.Mid(typeText, 1, typeText.IndexOf(" - ") - 1);
    WebBrowser1.DocumentText = "<HTML><HEADER><STYLE>Table {    border: 1px solid gray; text-indent: 3px; }  #BC {Font = 80px Code39HalfInch; transform: scale(1, 3); }; </STYLE></HEADER><BODY>" + "<TABLE Width=\"400\"> " + "<TR background-color=\"salmon\"><TD Width=\"120\" STYLE=\"font-size:40px\" ROWSPAN=3 align=\"center\">" + ContType + "</TD><TD Width=\"200\" ID=\"BC\" align=\"center\">*" + ItemID.ToString("00000") + "*</TD></TR>" + "<TR background-color=\"salmon\"><TD Width=\"200\" align=\"center\">" + ItemID.ToString("00000") + "</TD></TR>" + "<TR background-color=\"salmon\"><TD Width=\"200\">EUR palet</TD></TR></TABLE></BODY></HTML>";
    WebBrowser2.DocumentText = "<HTML><HEADER><STYLE>Table {    border: 1px solid gray; text-indent: 3px; }  #BC {Font = 60px Code39HalfInch; transform: scale(1, 3); }; </STYLE></HEADER><BODY>" + "<p><img width=\"200\" src=\"file:///G:/Graphics/Epal2.png\" alt=\"EPAL\"></p></BODY></HTML>";
    this.NewID.Text = ItemID.ToString();
    this.BarCode.Text = "*" + ItemID.ToString() + "*";
}

VB.NET:

Private Sub CreateAndShowItemLabel(ItemID As Int64)
    Dim typeText As String = Me.ItemType.GetItemText(Me.ItemType.SelectedItem)
    Dim ContType As String = Mid(typeText, 1, typeText.IndexOf(" - ") - 1)
    WebBrowser1.DocumentText = "<HTML><HEADER><STYLE>Table {    border: 1px solid gray; text-indent: 3px; }  #BC {Font = 80px Code39HalfInch; transform: scale(1, 3); }; </STYLE></HEADER><BODY>" &
                                  "<TABLE Width=""400""> " &
                                  "<TR background-color=""salmon""><TD Width=""120"" STYLE=""font-size:40px"" ROWSPAN=3 align=""center"">" & ContType & "</TD><TD Width=""200"" ID=""BC"" align=""center"">*" & ItemID.ToString("00000") & "*</TD></TR>" &
                                  "<TR background-color=""salmon""><TD Width=""200"" align=""center"">" & ItemID.ToString("00000") & "</TD></TR>" &
                                  "<TR background-color=""salmon""><TD Width=""200"">EUR palet</TD></TR></TABLE></BODY></HTML>"
    WebBrowser2.DocumentText = "<HTML><HEADER><STYLE>Table {    border: 1px solid gray; text-indent: 3px; }  #BC {Font = 60px Code39HalfInch; transform: scale(1, 3); }; </STYLE></HEADER><BODY>" &
                                  "<p><img width=""200"" src=""file:///G:/Graphics/Epal2.png"" alt=""EPAL""></p></BODY></HTML>"
    Me.NewID.Text = ItemID.ToString
    Me.BarCode.Text = "*" & ItemID.ToString & "*"
End Sub

3) Аналогично, вы можете сделатьэто с RTF , но это может быть немного сложнее

4) Одним из наиболее профессиональных подходов является использование (Free Open Source) программного обеспечения, такого как MigraDoc и создайте надежный PDF-документ, который можно отображать и / или отправлять на принтер.Тем не менее, это, безусловно, не самый быстрый метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...