none
Impressão automatizada RRS feed

  • Pergunta

  • Existe algum componente hoje que você passa um form como parâmetro e ele gera uma impressão de tudo q ta no formulário ou algo assim bem automatizado?
    Ou só algo que você passe dados direto e ele já renderiza? Não quero utilizar crystal nem nada de terceiros. Quero usar o print do .net mesmo.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    • Movido C. Augusto Proiete [MVP] domingo, 31 de janeiro de 2010 18:15 Movido para fórum apropriado (De:.NET Development - Geral)
    quarta-feira, 7 de outubro de 2009 14:23

Respostas

  • Leandro fiz alguma coisa bem simples, mas é alguma coisa hahaha. Só mesmo como uma idéia para você, criei essa classe:

    public class AutoPrint : PrintDocument
        {
            private readonly Form form;
    
            public AutoPrint() : base()
            {
                this.PrintPage += new PrintPageEventHandler(AutoPrint_PrintPage);
            }
    
            public AutoPrint(Form form) : base()
            {
                this.form = form;
                this.PrintPage += new PrintPageEventHandler(AutoPrint_PrintPage);
            }
    
            void AutoPrint_PrintPage(object sender, PrintPageEventArgs e)
            {
                foreach (Control control in this.form.Controls)
                {
                    if (control.GetType() != typeof(ListBox) && control.GetType() != typeof(DataGridView))
                    {
                        e.Graphics.DrawString(control.Text, control.Font, new SolidBrush(control.ForeColor), new PointF(control.Location.X, control.Location.Y));
                    }
                    else if (control.GetType() == typeof(ListBox))
                    {
                        float count = 0;
                        ListBox listBox = control as ListBox;
                        foreach (var item in listBox.Items)
                        {
                            e.Graphics.DrawString(item.ToString(), control.Font, new SolidBrush(control.ForeColor),
                                new PointF(control.Location.X, control.Location.Y + control.Font.Size * count));
                            count += 1.5F;
                        }
                    }
                    else if (control.GetType() == typeof(DataGridView))
                    {
                        float rowCount = 0;
                        int bigger = 0;
                        DataGridView dataGridView = control as DataGridView;
    
                        foreach (DataGridViewRow row in dataGridView.Rows)
                        {
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                if (cell.Value != null && cell.Value.ToString().Length > bigger)
                                    bigger = cell.Value.ToString().Length;
                            }
                        }
    
                        foreach (DataGridViewRow row in dataGridView.Rows)
                        {
                            float cellCount = 0;
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                e.Graphics.DrawString(cell.Value != null ? cell.Value.ToString() : "", control.Font, new SolidBrush(control.ForeColor),
                                    new PointF(control.Location.X + control.Font.Size * cellCount, control.Location.Y + control.Font.Size * rowCount));
                                cellCount += bigger;
                            }
                            rowCount += 1.5F;
                        }
                    }
                }
            }
    Como você ve ela herda de PrintDocument, então a maneira de usar será a mesma, porém é só passar o form para ela e pronto:

    AutoPrint print = new AutoPrint(this);

    Ela ja trata o evento de Print então é só jogar no preview ou imprimir direto que isso ja estará feito.
    Bom isso foi só uma idéia, espero ter ajudado.
    segunda-feira, 12 de outubro de 2009 05:50

Todas as Respostas

  • Leandro nesse link mostrei passo a passo, não é tão simples mas é a maneira de fazer no .NET

    http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/c495568f-66db-4ce0-9fd5-1ed9b6670caf
    quarta-feira, 7 de outubro de 2009 15:29
  • Murilo, esta parte eu já conheço o processo. Gostaria de saber se existe algum componente que, de forma automatizada, pegue os controles de um form e imprima. O que eu não queria, era pra cada tela, criar e calcular os locais certinhos, isso e aquilo. Queria algo mais automático

    Obrigado mesmo assim por esta ajuda.

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quarta-feira, 7 de outubro de 2009 16:30
  • Leandro .NET tenho quase certeza que não existirá pelo menos no livro da certificação do windows forms 3.5 ele não cita em nenhum momento.
    Talvez você ache em codeplex e tal.
    quarta-feira, 7 de outubro de 2009 16:36
  • Eu dei uma procurada no codeproject. pode ser um componente montado não tem problemas.
    é isso mesmo q to procurando. um projeto que faça isso
    :/

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quarta-feira, 7 de outubro de 2009 16:41
  • Leandro legal seria esse projeto hein. To pensando até em fazer, como seria essa impressão: da mesma maneira que está o form você imprimir, por exemplo:

    textBox1                textBox2
    richtextbox-------------------

    Ai imprimiria

    textBox1.Text          textBox2.text
    richtextbox.texttttttttttttttttttttttttttt


    ?
    quarta-feira, 7 de outubro de 2009 16:45
  • Ainda não sei Murilo. Meio complicado não? hehe
    Eu fiz um "sample" que funciona diferente (bem diferente) mas está em beta. Pelo jeito vou dar continuidade no projeto.
    Você adiciona "linhas" na página (new printrow()) e essa linha tem colunas.
    Bom, só pra facilitar a explicação do que fiz, é como criar uma tabela de um HTML. Tem linhas, tem colunas, define os tamanhos, etc etc
    Isso automatiza um pouco (evitar o cálculo dos posicionamentos) mas você precisa informar campo a campo ainda
    :/

    Mas se fosse como estavamos discutindo, pensei em como está na tela vai pra folha.
    o espaço que a caixa ocupa em branco (texto mesmo vazio) ocuparia com nada na folha final
    TextBoxNomeCliente está vazio na tela e o TextBoxNomeContato tem Murilo Amarú
    Na impressão ficaria
    Nome:                                                                               Contato: Murilo Amarú

    Talvez utilizazar uma nova propriedade nos componentes da tela (como o toltip faz hoje, cria uma nova property) para definir se deve imprimir o campo ou não.
    mas não sei ainda... imagino que seja bem complicado
    :/

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    quarta-feira, 7 de outubro de 2009 17:08
  • Leandro fiz alguma coisa bem simples, mas é alguma coisa hahaha. Só mesmo como uma idéia para você, criei essa classe:

    public class AutoPrint : PrintDocument
        {
            private readonly Form form;
    
            public AutoPrint() : base()
            {
                this.PrintPage += new PrintPageEventHandler(AutoPrint_PrintPage);
            }
    
            public AutoPrint(Form form) : base()
            {
                this.form = form;
                this.PrintPage += new PrintPageEventHandler(AutoPrint_PrintPage);
            }
    
            void AutoPrint_PrintPage(object sender, PrintPageEventArgs e)
            {
                foreach (Control control in this.form.Controls)
                {
                    if (control.GetType() != typeof(ListBox) && control.GetType() != typeof(DataGridView))
                    {
                        e.Graphics.DrawString(control.Text, control.Font, new SolidBrush(control.ForeColor), new PointF(control.Location.X, control.Location.Y));
                    }
                    else if (control.GetType() == typeof(ListBox))
                    {
                        float count = 0;
                        ListBox listBox = control as ListBox;
                        foreach (var item in listBox.Items)
                        {
                            e.Graphics.DrawString(item.ToString(), control.Font, new SolidBrush(control.ForeColor),
                                new PointF(control.Location.X, control.Location.Y + control.Font.Size * count));
                            count += 1.5F;
                        }
                    }
                    else if (control.GetType() == typeof(DataGridView))
                    {
                        float rowCount = 0;
                        int bigger = 0;
                        DataGridView dataGridView = control as DataGridView;
    
                        foreach (DataGridViewRow row in dataGridView.Rows)
                        {
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                if (cell.Value != null && cell.Value.ToString().Length > bigger)
                                    bigger = cell.Value.ToString().Length;
                            }
                        }
    
                        foreach (DataGridViewRow row in dataGridView.Rows)
                        {
                            float cellCount = 0;
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                e.Graphics.DrawString(cell.Value != null ? cell.Value.ToString() : "", control.Font, new SolidBrush(control.ForeColor),
                                    new PointF(control.Location.X + control.Font.Size * cellCount, control.Location.Y + control.Font.Size * rowCount));
                                cellCount += bigger;
                            }
                            rowCount += 1.5F;
                        }
                    }
                }
            }
    Como você ve ela herda de PrintDocument, então a maneira de usar será a mesma, porém é só passar o form para ela e pronto:

    AutoPrint print = new AutoPrint(this);

    Ela ja trata o evento de Print então é só jogar no preview ou imprimir direto que isso ja estará feito.
    Bom isso foi só uma idéia, espero ter ajudado.
    segunda-feira, 12 de outubro de 2009 05:50
  • Murilo, parece perfeito hehehe
    Muito obrigado. Assim que me sobrar um pouco de tempo vou dar uma "penteada" e tentar criar um componente!
    Disponibilizo no code project e pode deixar que ponho seu nome no fonte inicial hehehe

    abraços!

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    terça-feira, 13 de outubro de 2009 12:31
  • Eu montei no meu site um exemplo completo de impressão via Web. Que muitos dizem impossível..rs..
    http://sites.google.com/site/tecguia/impresso-utilizando-aspnet--impresso-via-web

    Espero que ajude

    João da Costa
    João da Costa
    terça-feira, 13 de outubro de 2009 12:49
  • Valeu Leandro, como você deve ter visto tem muita coisa a ser tratada, quando o tamanho do form estourar o tamanho da folha e tal, mas é um começo.
    Ja da pra quebrar um galho para form simples hahaha.
    Abraço.
    terça-feira, 13 de outubro de 2009 14:12