Jump to content

Imprimir datos del formulario ordenados....


Recommended Posts

Hola a todos!, he estado día y noche buscando por Internet y nada aún. Espero recibir una ayuda de ustedes jajaja... bueno les explico.

 

Estoy trabajando con visual estudio, programando en C#, tengo un Form (modulo de venta) con varios textbox y un datagrid.

 

Lo que necesito es imprimir aquellos datos de los textbox y datagrid a una factura. Entonces he estado leyendo sobre PrintDocument, PrintDialog y PrintPreviewDialog que son herramientas para poder imprimir y pre visualizar , pero no se como traspasar los datos ordenados como yo quiera a un printDocument

 

(((se supone que los datos que se imprima. tiene que estar justo al espacio de la hoja de la factura))).

 

Alguien ha hecho esta pega por algún lado? habrá otra manera de hacer esto pero mas fácil ?

 

O alguien que sepa ocupar estas herramientas PrintDocument? necesito una ayuda urgente!

 

se los agradecería un montón!

Hasta luego.

 

Les dejo una foto de mi Form.

 

venta.jpg

 

Link to comment
Share on other sites

Necesitas un PrintDialog y un PrintDocument. Debes asociar ambos usando la propiedad Document del PrintDialog, es decir, a la propiedad Document le asignas el objeto PrintDocument.

s09831837762.png

[hide]

ADVERTENCIA: Puede que el PrintDialog no funcione bien en equipos 64 bits. Para evitar problemas tienes 2 opciones:

  • Compila tu proyecto como x86.
  • Asegúrate que la propiedad UseEXDialog del PrintDialog sea true (o sea, usa esta opción si la plataforma de destino es x64 ó AnyCPU).
Para iniciar la impresión, generalmente haces algo similar a esto:
if (printDialog1.ShowDialog() == DialogResult.OK)
    printDocument1.Print();
[/hide]

 

El método Print inicia el proceso de impresión de forma asíncrona. Después tienes que "dibujar" todo lo que quieras que aparezca en la página usando un manejador del evento PrintPage del objeto PrintDocument (el evento PrintPage es iniciado por el método Print).

Ahora, la manera en que "dibujas" el contenido de la página en Windows Forms es bastante rudimentaria, simplemente "dibujas" sobre un objeto Graphics, es decir, generalmente vas a usar los métodos Draw... de esta clase.

 

Ojo, la clase PrintDocument tiene una propiedad booleana llamada OriginAtMargins; si es true la coordenada (0,0) será la esquina superior izquierda del área imprimible de la hoja, si es false la coordenada (0,0) será la esquina superior izquierda de la hoja. O sea:

  • OriginAtMargins = true: Para mantenerte dentro de los márgenes del documento usas las propiedades Width y Height de MarginBounds, además las coordenadas x e y deben ser mayores o iguales a cero (si son negativas te sales de los márgenes izquierdo y/o superior del documento).
  • OriginAtMargins = false: Para mantenerte dentro de los márgenes del documento usas las propiedades Left, Top, Right, Bottom de MarginBounds. Por ejemplo, el solo hecho usar coordenadas x mayores a cero no te garantiza que estés dentro de los márgenes nono%5B1%5D.gif , deben ser mayores o iguales a MarginBounds.Left.
Aquí hay un ejemplo del manejador del evento PrintPage. Son 2 versiones, para que veas cómo respetar los márgenes del documento dependiendo del valor de la propiedad OriginAtMargins:

[hide]

OriginAtMargins = false

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    string texto;
    float x, y, x0, alturaLinea;
    int i;

    using (Font fuente = new Font("Verdana", 24))
    {
        // Posicionar el "cursor" para empezar a imprimir
        x = e.MarginBounds.Left;
        y = e.MarginBounds.Top;
        // Alto de línea (para texto)
        alturaLinea = fuente.GetHeight(e.Graphics);
        for (i = 1; i <= 5; i++)
        {
            if (i % 2 == 0)
            {
                texto = "Justificado a la derecha (" + i.ToString();
                x0 = e.MarginBounds.Right - e.Graphics.MeasureString(texto, fuente).Width;
            }
            else
            {
                texto = i.ToString() + ") Justificado a la izquierda";
                x0 = x;
            }
            e.Graphics.DrawString(texto, fuente, Brushes.Black, x0, y);
            // Pasar a la siguiente línea
            y += alturaLinea;
        }
        y += alturaLinea;
        // Dibujar una imagen centrada
        e.Graphics.DrawImage(Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"), new RectangleF(x + e.MarginBounds.Width / 2 - 160, y, 320, 240));
        y += 270;
        texto = "Imagen centrada";
        using (Font fnt = new Font("Courier New", 18, FontStyle.Bold))
        {
            e.Graphics.DrawString(texto, fnt, Brushes.ForestGreen, x + (e.MarginBounds.Width - e.Graphics.MeasureString(texto, fnt).Width) / 2, y);
            texto = "Hasta aquí no más llegamos";
            e.Graphics.DrawString(texto, fnt, Brushes.Tomato, x + (e.MarginBounds.Width - e.Graphics.MeasureString(texto, fnt).Width) / 2, e.MarginBounds.Bottom - fnt.GetHeight(e.Graphics));
        }
        e.Graphics.DrawLine(Pens.DarkOrange, x, e.MarginBounds.Bottom, e.MarginBounds.Right, e.MarginBounds.Bottom);
    }
}

OriginAtMargins = true

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    string texto;
    float x, y, x0, alturaLinea;
    int i;

    using (Font fuente = new Font("Verdana", 24))
    {
        // Posicionar el "cursor" para empezar a imprimir
        x = 0;
        y = 0;
        // Alto de línea (para texto)
        alturaLinea = fuente.GetHeight(e.Graphics);
        for (i = 1; i <= 5; i++)
        {
            if (i % 2 == 0)
            {
                texto = "Justificado a la derecha (" + i.ToString();
                x0 = e.MarginBounds.Width - e.Graphics.MeasureString(texto, fuente).Width;
            }
            else
            {
                texto = i.ToString() + ") Justificado a la izquierda";
                x0 = x;
            }
            e.Graphics.DrawString(texto, fuente, Brushes.Black, x0, y);
            // Pasar a la siguiente línea
            y += alturaLinea;
        }
        y += alturaLinea;
        // Dibujar una imagen centrada
        e.Graphics.DrawImage(Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"), new RectangleF(e.MarginBounds.Width / 2 - 160, y, 320, 240));
        y += 270;
        texto = "Imagen centrada";
        using (Font fnt = new Font("Courier New", 18, FontStyle.Bold))
        {
            e.Graphics.DrawString(texto, fnt, Brushes.ForestGreen, (e.MarginBounds.Width - e.Graphics.MeasureString(texto, fnt).Width) / 2, y);
            texto = "Hasta aquí no más llegamos";
            e.Graphics.DrawString(texto, fnt, Brushes.Tomato, (e.MarginBounds.Width - e.Graphics.MeasureString(texto, fnt).Width) / 2, e.MarginBounds.Height - fnt.GetHeight(e.Graphics));
        }
        e.Graphics.DrawLine(Pens.DarkOrange, 0, e.MarginBounds.Height, e.MarginBounds.Width, e.MarginBounds.Height);
    }
}

Por si acaso, eso Posicionar el "cursor" para empezar a imprimir es algo más didáctico que otra cosa (en realidad ni siquiera existe un cursor que vaya moviéndose a medida que escribes o dibujas algo), uno simplemente dibuja figuras, líneas y texto en un objeto Graphics. De hecho, ni siquiera tienes la obligación de respetar los márgenes del documento.

Otra cosa, este es un ejemplo de cómo imprimir un documento de una sola página; si quieres imprimir un documento compuesto por varias páginas o ajustar párrafos de varias líneas, eso es un poco más complicado.

Por último, si quieres probar el ejemplo de arriba, pero no quieres gastar tinta, simplemente usa alguna impresora virtual, por ejemplo, la XPS Document Writer que viene incluida en las últimas versiones de Windows ;) .

[/hide]

Link to comment
Share on other sites

Compadre te las mandaste con esa explicación sublime. Bueno te cuento que un poco, excursionando con el objeto Graphics logré realizar mi cotización sacando los datos a través del form, la verdad es que es demasiado facil. Primero tuve que hacer el diseño de la cotización ya sea Encabezado, Cuerpo y los cuadrados para detallar los productos y para los datos del cliente. Después simplemente fui llenando los espacios con los datos de los textBox.

 

Para ir viendo como me iba quedando use el método PrintPreviewDialog.ShowDialog()

 

Aquí una muestra de como quedo mi cotización...

 

cotizacionn.jpg

 

De todos modos tu explicación me dejo mas clara la película.

Se agradece!

 

seba.

Link to comment
Share on other sites

  • 1 year later...

tengo una pregunta yo estoy haciendo algo similar cargo datos en textBox y tambien estoy Graficando la informacion la saco de una bd en access y quiero saber si me pueden ayudar como genera un informe con el formulario tal cual pero que no se vean los botones ni comboBox poder generar un word pdf o excel o powerpoint seria de gran ayudas por favor.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...