Domanda

My problem is that is that my code prints the images overlapping each other. I do not know how to change the x and y positions. The printer should print 3 images per row and then move to the next row.

 private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        for (int serial = 0; serial < SaveBeforePrint.Count; serial++)
        {
            String intercharacterGap = "0";
            String str = '*' + SaveBeforePrint[serial].ToUpper() + '*';
            int strLength = str.Length;

            for (int i = 0; i < SaveBeforePrint[serial].Length; i++)
            {
                string barcodestring = SaveBeforePrint[serial].ToUpper();
                if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*')
                {
                    e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10);
                    return;
                }
            }

            String encodedString = "";

            for (int i = 0; i < strLength; i++)
            {
                if (i > 0)
                    encodedString += intercharacterGap;

                encodedString += coded39Char[alphabet39.IndexOf(str[i])];
            }

            int encodedStringLength = encodedString.Length;
            int widthOfBarCodeString = 0;
            double wideToNarrowRatio = 3;


            if (align != AlignType.Left)
            {
                for (int i = 0; i < encodedStringLength; i++)
                {
                    if (encodedString[i] == '1')
                        widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight);
                    else
                        widthOfBarCodeString += (int)weight;
                }
            }

            int x = 0;
            int wid = 0;
            int yTop = 0;
            SizeF hSize = e.Graphics.MeasureString(headerText, headerFont);
            SizeF fSize = e.Graphics.MeasureString(code, footerFont);

            int headerX = 0;
            int footerX = 0;
            int printonpage = 0;

            if (align == AlignType.Left)
            {
                x = leftMargin;
                headerX = leftMargin;
                footerX = leftMargin;
            }

            else if (align == AlignType.Center)
            {
                    x = (Width - widthOfBarCodeString) / 2;
                    headerX = (Width - (int)hSize.Width) / 2;
                    footerX = (Width - (int)fSize.Width) / 2;

            }
            else
            {
                x = Width - widthOfBarCodeString - leftMargin;
                headerX = Width - (int)hSize.Width - leftMargin;
                footerX = Width - (int)fSize.Width - leftMargin;
            }

            if (showHeader)
            {
                yTop = (int)hSize.Height + topMargin;
                e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin);
            }
            else
            {
                yTop = topMargin;
            }

            for (int i = 0; i < encodedStringLength; i++)
            {
                    if (encodedString[i] == '1')
                        wid = (int)(wideToNarrowRatio * (int)weight);
                    else
                        wid = (int)weight;

                    e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, yTop, wid, height);

                    x += wid;



            }
            yTop += height;

            if (showFooter)
                e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, yTop);
        }

    }

Desired output :

enter image description here

I am getting :

enter image description here

As you can see the last digit is overlapping. I want to draw it next to the previous one

È stato utile?

Soluzione

I have observed the code and found the issue.. in panel1_print u are not incrementing the values properly..

I have made the required changes now u will get the 4 bar in a line and 5th one in another line - check the attached image.

enter image description here

just replace ur panel1_Paint with this new code thats it you can find the changes.. I have marked them as

//start changes by Deepak
..
..
..
//end changes by Deepak

and also declare two variables loopValX and loopValY as int

here is the code..

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    int loopValX = 0;
    int loopValY = -150;

    for (int serial = 0; serial < SaveBeforePrint.Count; serial++)
    {
        String intercharacterGap = "0";
        String str = '*' + SaveBeforePrint[serial].ToUpper() + '*';
        int strLength = str.Length;

        for (int i = 0; i < SaveBeforePrint[serial].Length; i++)
        {
            string barcodestring = SaveBeforePrint[serial].ToUpper();
            if (alphabet39.IndexOf(barcodestring[i]) == -1 || barcodestring[i] == '*')
            {
                e.Graphics.DrawString("INVALID BAR CODE TEXT", Font, Brushes.Red, 10, 10);
                return;
            }
        }

        String encodedString = "";

        for (int i = 0; i < strLength; i++)
        {
            if (i > 0)
                encodedString += intercharacterGap;

            encodedString += coded39Char[alphabet39.IndexOf(str[i])];
        }

        int encodedStringLength = encodedString.Length;
        int widthOfBarCodeString = 0;
        double wideToNarrowRatio = 3;


        if (align != AlignType.Left)
        {
            for (int i = 0; i < encodedStringLength; i++)
            {
                if (encodedString[i] == '1')
                    widthOfBarCodeString += (int)(wideToNarrowRatio * (int)weight);
                else
                    widthOfBarCodeString += (int)weight;
            }
        }


        SizeF hSize = e.Graphics.MeasureString(headerText, headerFont);
        SizeF fSize = e.Graphics.MeasureString(SaveBeforePrint[serial], footerFont);

        int headerX = 0;
        int footerX = 0;

        if (align == AlignType.Left)
        {
            x = leftMargin;
            headerX = leftMargin;
            footerX = leftMargin;
        }

        else if (align == AlignType.Center)
        {
                x = (Width - widthOfBarCodeString) / 2;
                headerX = (Width - (int)hSize.Width) / 2;
                footerX = (Width - (int)fSize.Width) / 2;
        }
        else
        {
            x = Width - widthOfBarCodeString - leftMargin;
            headerX = Width - (int)hSize.Width - leftMargin;
            footerX = Width - (int)fSize.Width - leftMargin;
        }

        if (showHeader)
        {
            y = (int)hSize.Height + topMargin;
            e.Graphics.DrawString(headerText, headerFont, Brushes.Black, headerX, topMargin);
        }
        else
        {
            y = topMargin;
        }


        //start changes by Deepak
        if (serial % 4 == 0)
        {
            loopValX = 0;
            loopValY += 150;
        }
        else
        {
            loopValX += 150;
        }

        x += loopValX;
        y += loopValY;
        footerX += loopValX;

        //end changes by Deepak


        for (int i = 0; i < encodedStringLength; i++)
        {
                if (encodedString[i] == '1')
                    wid = (int)(wideToNarrowRatio * (int)weight);
                else
                    wid = (int)weight;

                e.Graphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, x, y, wid, height);

                x += wid;

        }
        y += height;

        if (showFooter)
            e.Graphics.DrawString(SaveBeforePrint[serial], footerFont, Brushes.Black, footerX, y);
    }

}

Altri suggerimenti

You Should do it with the help of a DataGridView (That Contains Images in a Column). The Images Will Then Print in each new row or column (by modifying as your desire) The Following Class will do your work by passing it the whole DataGridView And Header in its constructor.

using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Linq;

namespace Waqas
{
    internal class ClsPrint
    {
        #region Variables

        private int iCellHeight = 0; //Used to get/set the datagridview cell height
        private int iTotalWidth = 0; //
        private int iRow = 0; //Used as counter
        private bool bFirstPage = false; //Used to check whether we are printing first page
        private bool bNewPage = false; // Used to check whether we are printing a new page
        private int iHeaderHeight = 0; //Used for the header height
        private StringFormat strFormat; //Used to format the grid rows.
        private ArrayList arrColumnLefts = new ArrayList(); //Used to save left coordinates of columns
        private ArrayList arrColumnWidths = new ArrayList(); //Used to save column widths
        private PrintDocument _printDocument = new PrintDocument();
        private DataGridView gw = new DataGridView();
        private string _ReportHeader;

        #endregion

        public ClsPrint(DataGridView gridview, string ReportHeader)
        {
            _printDocument.DefaultPageSettings.Landscape = true;
            _printDocument.DefaultPageSettings.PaperSize.RawKind = (int)PaperKind.A4;
            _printDocument.DefaultPageSettings.Margins = new Margins(30, 30, 30, 30);

            //_printDocument.DefaultPageSettings.PaperSize.PaperName = "A4";

            _printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage);
            _printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint);
            gw = gridview;
            _ReportHeader = ReportHeader;
        }

        public void PrintForm()
        {
            //Open the print preview dialog
            PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
            objPPdialog.Document = _printDocument;
            objPPdialog.ShowIcon = false;
            objPPdialog.Text = "Print Preview";
            objPPdialog.WindowState = FormWindowState.Maximized;
            objPPdialog.ShowDialog();
        }

        private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //try
            //{
            //Set the left margin
            int iLeftMargin = e.MarginBounds.Left;
            //Set the top margin
            int iTopMargin = e.MarginBounds.Top;
            //Whether more pages have to print or not
            bool bMorePagesToPrint = false;
            int iTmpWidth = 0;

            //For the first page to print set the cell width and header height
            if (bFirstPage)
            {
                foreach (DataGridViewColumn GridCol in gw.Columns)
                {
                    iTmpWidth = ((int) (Math.Floor((double) ((double) GridCol.Width/
                                                            (double) iTotalWidth*(double) iTotalWidth*
                                                            ((double) e.MarginBounds.Width/(double) iTotalWidth)))));

                    iHeaderHeight = (int) (e.Graphics.MeasureString(GridCol.HeaderText,
                        GridCol.InheritedStyle.Font, iTmpWidth).Height) + 60;

                    // Save width and height of headers
                    arrColumnLefts.Add(iLeftMargin);
                    arrColumnWidths.Add(iTmpWidth);
                    iLeftMargin += iTmpWidth;
                }
            }
            //Loop till all the grid rows not get printed
            while (iRow <= gw.Rows.Count - 1)
            {
                DataGridViewRow GridRow = gw.Rows[iRow];
                //Set the cell height
                iCellHeight = GridRow.Height + 30;
                int iCount = 0;
                //Check whether the current page settings allows more rows to print
                if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
                {
                    bNewPage = true;
                    bFirstPage = false;
                    bMorePagesToPrint = true;
                    break;
                }
                else
                {

                    if (bNewPage)
                    {
                        //Draw Header
                        e.Graphics.DrawString(_ReportHeader,
                            new Font("Calibri Light", 20, FontStyle.Bold),
                            new SolidBrush(Color.Black), e.MarginBounds.Left,
                            e.MarginBounds.Top+20 - e.Graphics.MeasureString(_ReportHeader,
                                new Font(gw.Font, FontStyle.Bold),
                                e.MarginBounds.Width).Height - 13);

                        String strDate = DateTime.Now.ToString("dd-MMM-yy hh:mm tt");
                        //Draw Date
                        e.Graphics.DrawString(strDate,
                            new Font("Calibri Light", 12, FontStyle.Bold), Brushes.Black,
                            e.MarginBounds.Left-20 +
                            (e.MarginBounds.Width - e.Graphics.MeasureString(strDate,
                                new Font(gw.Font, FontStyle.Bold),
                                e.MarginBounds.Width).Width),
                            e.MarginBounds.Top+30 - e.Graphics.MeasureString(_ReportHeader,
                                new Font(new Font(gw.Font, FontStyle.Bold),
                                    FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                        //Draw Columns                 
                        iTopMargin = e.MarginBounds.Top+30;
                        DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count];
                        int colcount = 0;
                        //Convert ltr to rtl
                        foreach (DataGridViewColumn GridCol in gw.Columns)
                        {
                            _GridCol[colcount++] = GridCol;
                        }
                        for (int i =0;  i <= (_GridCol.Count() - 1); i++)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.Gainsboro),
                                new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight));

                            e.Graphics.DrawRectangle(new Pen(Color.Black),
                                new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight));

                            e.Graphics.DrawString(_GridCol[i].HeaderText,
                                new Font("Calibri Light", 12, FontStyle.Bold),
                                new SolidBrush(Color.Black),
                                new RectangleF((int) arrColumnLefts[iCount], iTopMargin,
                                    (int) arrColumnWidths[iCount], iHeaderHeight), strFormat);
                            iCount++;
                        }
                        bNewPage = false;
                        iTopMargin += iHeaderHeight;
                    }
                    iCount = 0;
                    DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count];
                    int cellcount = 0;
                    //Convert ltr to rtl
                    foreach (DataGridViewCell Cel in GridRow.Cells)
                    {
                        _GridCell[cellcount++] = Cel;
                    }
                    //Draw Columns Contents                
                    for (int i =0; i <=(_GridCell.Count() - 1); i++)
                    {
                        if (_GridCell[i].Value != null)
                        {
                            if (_GridCell[i].GetType() != typeof (DataGridViewImageCell))
                            {
                                e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(),
                                    new Font("Calibri Light", 10),
                                    new SolidBrush(Color.Black),
                                    new RectangleF((int) arrColumnLefts[iCount],
                                        (float) iTopMargin,
                                        (int) arrColumnWidths[iCount], (float) iCellHeight),
                                    strFormat);
                            }
                            else
                            {








                                Image img = Common.byteArrayToImage((byte[]) _GridCell[i].Value);
                                Rectangle m = new Rectangle((int) arrColumnLefts[iCount],iTopMargin,
                                                            (int) arrColumnWidths[iCount],  iCellHeight);

                                if ((double)img.Width / (double)img.Height > (double)m.Width / (double)m.Height) // image is wider
                                {
                                    m.Height = (int)((double)img.Height / (double)img.Width * (double)m.Width);
                                }
                                else
                                {
                                    m.Width = (int)((double)img.Width / (double)img.Height * (double)m.Height);
                                }
                                e.Graphics.DrawImage(img, m);








                            }
                        }
                        //Drawing Cells Borders 
                        e.Graphics.DrawRectangle(new Pen(Color.Black),
                            new Rectangle((int) arrColumnLefts[iCount], iTopMargin,
                                (int) arrColumnWidths[iCount], iCellHeight));
                        iCount++;
                    }
                }
                iRow++;
                iTopMargin += iCellHeight;
            }
            //If more lines exist, print another page.
            if (bMorePagesToPrint)
                e.HasMorePages = true;
            else
                e.HasMorePages = false;
            //}
            //catch (Exception exc)
            //{
            //    KryptonMessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK,
            //       MessageBoxIcon.Error);
            //}
        }

        private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            try
            {
                strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;
                strFormat.LineAlignment = StringAlignment.Center;
                strFormat.Trimming = StringTrimming.EllipsisCharacter;

                arrColumnLefts.Clear();
                arrColumnWidths.Clear();
                iCellHeight = 0;
                iRow = 0;
                bFirstPage = true;
                bNewPage = true;

                // Calculating Total Widths
                iTotalWidth = 0;
                foreach (DataGridViewColumn dgvGridCol in gw.Columns)
                {
                    iTotalWidth += dgvGridCol.Width;
                }
            }
            catch (Exception ex)
            {
                KryptonMessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

    }
}

as

ClsPrint _ClsPrint = new ClsPrint(myDataGridView, "MyHeader");
_ClsPrint.PrintForm();

Your position variables are being declared inside the loop, meaning that they are reset for each pass through the loop. Keep position variables for X and Y outside of the loop over serial and adjust it for the total width (and height, if you start a new row of barcodes) of each barcode.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top