none
Cupom não Fiscal em C# WPF RRS feed

  • Pergunta

  • Boa Tarde, 

    Pessoal estou criando uma aplicação em WPF de fluxo de caixa e estou precisando criar um Cupom Não fiscal em C#, primeiro não sei qual Controle do C# devo usar para exibir o Cupom digital na tela do sistema, onde vai ficar sendo inserido os produto, e nem como coletar estas informações para mandar imprimir.

    alguém sabe como posso fazer isso e qual controle devo usar se uma List box, listviwer, Textblox etc.

    segunda-feira, 25 de maio de 2015 17:36

Respostas

  • Mais em que momento esta adicionando os dados a grid?

    Pois para adicionar é preciso:
    grdDetails.Items.Add(new Person(){FirstName="Teste",LastName="SegundoNome"});


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    • Marcado como Resposta Moisés CS sexta-feira, 5 de junho de 2015 16:41
    quarta-feira, 3 de junho de 2015 12:23

Todas as Respostas

  • Pessoal alguém me ajuda por favor!
    terça-feira, 26 de maio de 2015 16:32
  • Fala Moisés, vamos ver se eu entendi sua pergunta...vc quer organizar o formulário do cupom na tela para depois imprimir e não sabe quais componentes usar?

    Eu desenvolvi um emissor de NFe e NFCe em asp.net, os componentes que usei para imprimir o danfe foi só um gridview para os produtos e várias labels para as outras informações. Para deixar a impressão perfeita tive q organizar os componentes várias vezes até sair perfeita.

    Abs.


    terça-feira, 26 de maio de 2015 17:49
  • Eu usaria um ListView, ficaria mais organizado e tudo alinha perfeitamente, tutorial aqui

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 26 de maio de 2015 18:10
  • Olá,

    Escrevi um código simples para exemplificar como eu faria:

    Como você pode ver na imagem, ainda precisa ser refinado, uma fonte melhor, melhor alinhamento, etc. Meu propósito é apresentar o caminho.

    O código XAML da janela acima é esse:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <ScrollViewer HorizontalAlignment="Center" Height="301" Width="317">
                <Border Margin="20" Background="#FFFFFAA9">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="15" ShadowDepth="0"/>
                    </Border.Effect>
                    <StackPanel x:Name="receiptViewer" Margin="20"/>
                </Border>
                
            </ScrollViewer>
    
        </Grid>
    </Window>
    

    O Code Behind dessa janela é o seguinte:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                ReceiptViewerAdapter printer = new ReceiptViewerAdapter(receiptViewer);
                printer.AppendLine("CUPOM NÃO FISCAL", 16, TextAlignment.Center);
                printer.AppendLine();
                printer.AppendLine("Arroz .............................. R$1,00");
                printer.AppendLine("Feijão ............................. R$4,99");
                printer.AppendLine("Açucar ............................ R$12,99");
                printer.AppendLine("Gasolina .......................... R$45,99");
                printer.AppendLine("Djon ............................... R$2,99");
                printer.AppendLine("Seilá ............................. R$12,99");
                printer.AppendLine("___________________________________________");
                printer.AppendLine("Total                               R$80,95");
                printer.AppendLine();
                printer.AppendLine("http://herbertdotlausmann.wordpress.com/",12, TextAlignment.Center);
                printer.AppendLine();
                printer.Append("That's all folks!", 12, TextAlignment.Center);
            }
        }
    }
    

    Como é possível perceber ficou bem simples o XAML, e a geração do cupom. Isso se deve à classe ReceiptViewerAdapter que faz o encapsulamento da apresentação do texto. Segue o código dessa classe:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    
    namespace WpfApplication1
    {
        public sealed class ReceiptViewerAdapter
        {
            private StackPanel _Viewer;
    
            private StringBuilder _Source;
            private FontStyle _FontStyle;
    
            public FontStyle FontStyle
            {
                get { return _FontStyle; }
                set { _FontStyle = value; Refresh(); }
            }
            private FontFamily _FontFamily;
    
            public FontFamily FontFamily
            {
                get { return _FontFamily; }
                set { _FontFamily = value; Refresh(); }
            }
            private FontStretch _FontStretch;
    
            public FontStretch FontStretch
            {
                get { return _FontStretch; }
                set { _FontStretch = value; Refresh(); }
            }
            private FontWeight _FontWeight;
    
            public FontWeight FontWeight
            {
                get { return _FontWeight; }
                set { _FontWeight = value; Refresh(); }
            }
            public ReceiptViewerAdapter(StackPanel Viewer)
            {
                _Viewer = Viewer;
                _Viewer.Children.Clear();
                _FontFamily = new FontFamily("Lucida Sans Unicode");
                _FontStretch = FontStretches.Normal;
                _FontStyle = FontStyles.Normal;
                _FontWeight = FontWeights.Normal;
                _Source = new StringBuilder();
            }
    
            public StackPanel Viewer
            { get { return _Viewer; } }
    
            public StringBuilder Source
            {
                get { return _Source; }
            }
    
            public void Append(string text, int size = 12, TextAlignment align = TextAlignment.Left)
            {
                _Source.Append(text);
                if (_Viewer.Children.Count == 0)
                {
                    Label l = new Label();
                    _Viewer.Children.Add(l);
                }
    
                Label lastLine = (Label)_Viewer.Children[_Viewer.Children.Count - 1];
    
                string line = (string)lastLine.Content;
                line += text;
                lastLine.Content = line;
    
                if(align== TextAlignment.Left)
                    lastLine.HorizontalAlignment = HorizontalAlignment.Left;
                else if(align== TextAlignment.Center)
                    lastLine.HorizontalAlignment = HorizontalAlignment.Center;
                else if (align == TextAlignment.Right)
                    lastLine.HorizontalAlignment = HorizontalAlignment.Right;
                else if (align == TextAlignment.Justify)
                    lastLine.HorizontalAlignment = HorizontalAlignment.Stretch;
    
                lastLine.FontSize = size;
                lastLine.FontFamily = FontFamily;
                lastLine.FontStretch = FontStretch;
                lastLine.FontStyle = FontStyle;
                lastLine.FontWeight = FontWeight;
            }
    
            public void AppendLine(int size = 12, TextAlignment align = TextAlignment.Left)
            {
                _Source.AppendLine();
                Label l = new Label();
                _Viewer.Children.Add(l);
                l.FontSize = size;
                l.FontFamily = FontFamily;
                l.FontStretch = FontStretch;
                l.FontStyle = FontStyle;
                l.FontWeight = FontWeight;
            }
            public void AppendLine(string text, int size = 12, TextAlignment align = TextAlignment.Left)
            {
                _Source.AppendLine(text);
                Label l = new Label();
                _Viewer.Children.Add(l);
                l.FontSize = size;
                l.FontFamily = FontFamily;
                l.FontStretch = FontStretch;
                l.FontStyle = FontStyle;
                l.FontWeight = FontWeight;
                Append(text, size, align);
                AppendLine(size, align);
            }
    
            public void Clear()
            {
                _Viewer.Children.Clear();
                _Source.Clear();
                _Source = new StringBuilder();
            }
    
            private void Refresh()
            {
                foreach (UIElement ele in _Viewer.Children)
                {
                    Label l = (Label)ele;
                    l.FontFamily = FontFamily;
                    l.FontStretch = FontStretch;
                    l.FontStyle = FontStyle;
                    l.FontWeight = FontWeight;
                }
            }
        }
    }
    

    O ideal mesmo seria juntar tudo e criar um controle customizado, mas assim funciona também. Fiz assim pois, criar um controle customizado exige uma variedade de conhecimento, e complica mais. E o meu objetivo era apenas mostrar o conceito de forma simplificada.

    Espero ter ajudado, boa sorte!


    Herbert Lausmann

    terça-feira, 26 de maio de 2015 20:41
  • Como o Mr. GMSOFT mencionou, dá para usar o ListView também, ou DataGrid.

    Mas, se tratando da sua questão, o StackPanel é mais compatível com meus neurônios..


    Herbert Lausmann

    terça-feira, 26 de maio de 2015 20:44
  • Herbert Lausmann, primeiramente muito obrigado, mas ainda fiquei com uma dúvida, pois no seu Exemplo os produtos estão escritos diretamente no códido, no meu projeto eu sempre que digitar o código de barras o produto deve aparecer no cupom, e sem pre que digitar outro código anterior deve ficar lá e apenas acrescentar o novo, eu tentei mas sempre o produto anterior some fica a penas o novo.
    quarta-feira, 27 de maio de 2015 02:38
  • Boa Noite Diogenes Nonato, o que preciso é realmente o que o Herbert Lausmann, postou só estou conseguindo adcinar items pois quando adiciono um item o anterior some.
    quarta-feira, 27 de maio de 2015 02:57
  • Eu usaria um ListView, ficaria mais organizado e tudo alinha perfeitamente, tutorial aqui

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Boa noite dei uma olhada no  tutorial porém o mesmo e em vb e o meu projeto é C#
    quarta-feira, 27 de maio de 2015 03:06
  • A logica é a mesma não muda nada, basta converter segue links:
    Telerik Convert VB to C#
    Developer Fusion VB to C#


    DICA: Não se limite a detalhes, tudo pode ser convertido no Visual Studio é só pesquisar ;)


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    • Sugerido como Resposta Cristopher C I_ quarta-feira, 27 de maio de 2015 19:04
    quarta-feira, 27 de maio de 2015 11:43
  • A logica é a mesma não muda nada, basta converter segue links:
    Telerik Convert VB to C#
    Developer Fusion VB to C#


    DICA: Não se limite a detalhes, tudo pode ser convertido no Visual Studio é só pesquisar ;)


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Tentei converter com os links que vc passou mas não rodou

    quinta-feira, 28 de maio de 2015 01:12
  • A logica é a mesma não muda nada, basta converter segue links:
    Telerik Convert VB to C#
    Developer Fusion VB to C#


    DICA: Não se limite a detalhes, tudo pode ser convertido no Visual Studio é só pesquisar ;)


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Tentei converter com os links que vc passou mas não rodou

    quinta-feira, 28 de maio de 2015 01:18
  • Mais qual o problema que ocorreu? tente fazer de forma gradativa por blocos de codigo e não total

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    quinta-feira, 28 de maio de 2015 11:36
  • Mr. GMSOFT, como não consegui fazer do modo anterior, eu estou tentando usar uma datagrid, com varias coluna para receber meus itens, porém está dando outro problema não estou conseguindo pegar os valores da textbox e passar o datagrid.
    sábado, 30 de maio de 2015 16:10
  • Como esta fazendo para passar esses valores?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    domingo, 31 de maio de 2015 16:25
  • Como esta fazendo para passar esses valores?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Ainda não consegui mas estou tentando assim!

    .CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;


    namespace datagridteste3105
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            PersonList ListOfPersons = new PersonList();
            public MainWindow()
            {
                InitializeComponent();
            }

            private void btnInsert_Click(object sender, RoutedEventArgs e)
            {
                ListOfPersons.Add(new Person() { FirstName = textBox1.Text, LastName = textBox2.Text });
            }
         }
        public class PersonList : ObservableCollection<Person>
        {
            public PersonList()
            {
                this.Add(new Person() { FirstName = "Coding", LastName = "Sense" });
            }
        }

        public class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }

    domingo, 31 de maio de 2015 22:41
  • .XAML

    <Window x:Class="datagridteste3105.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
            Title="MainWindow" Height="350" Width="525" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:datagridteste3105="clr-namespace:datagridteste3105">
        <Window.Resources>
            <ObjectDataProvider x:Key="PersonListDS" d:IsDataSource="True"/>
        </Window.Resources>
        <Grid>

            <TextBox Height="26" HorizontalAlignment="Left" Margin="26,0,0,12" x:Name="textBox1" VerticalAlignment="Bottom" Width="128" />
            <TextBox Height="24" Margin="188,0,98,12" x:Name="textBox2" VerticalAlignment="Bottom" />
            <Button Height="24" HorizontalAlignment="Right" Margin="0,0,20,12" x:Name="btnInsert" VerticalAlignment="Bottom" Width="63" Click="btnInsert_Click" Content="Insert"/>
            
            <DataGrid x:Name="grdDetials" HorizontalAlignment="Left" Margin="26,10,0,0" VerticalAlignment="Top" Height="227" Width="393">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}"/>
                    <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}"/>
                </DataGrid.Columns>
            </DataGrid>

        </Grid>
    </Window>

    domingo, 31 de maio de 2015 22:41
  • Estou tentando assim mas os valores da texbox não estão indo para o datagrid e e não sei o pq!
    domingo, 31 de maio de 2015 22:46
  • .XAML

    <Window x:Class="datagridteste3105.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
            Title="MainWindow" Height="350" Width="525" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:datagridteste3105="clr-namespace:datagridteste3105">
        <Window.Resources>
            <ObjectDataProvider x:Key="PersonListDS" d:IsDataSource="True"/>
        </Window.Resources>
        <Grid>

            <TextBox Height="26" HorizontalAlignment="Left" Margin="26,0,0,12" x:Name="textBox1" VerticalAlignment="Bottom" Width="128" />
            <TextBox Height="24" Margin="188,0,98,12" x:Name="textBox2" VerticalAlignment="Bottom" />
            <Button Height="24" HorizontalAlignment="Right" Margin="0,0,20,12" x:Name="btnInsert" VerticalAlignment="Bottom" Width="63" Click="btnInsert_Click" Content="Insert"/>
            
            <DataGrid x:Name="grdDetials" HorizontalAlignment="Left" Margin="26,10,0,0" VerticalAlignment="Top" Height="227" Width="393">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}"/>
                    <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}"/>
                </DataGrid.Columns>
            </DataGrid>

        </Grid>
    </Window>

    Pessoal alguém sabe como posso adicionar o conteúdo da textbox no datagrid?
    terça-feira, 2 de junho de 2015 03:08
  • Você fez algum código para o botão Insert?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 15:50
  • .XAML

    <Window x:Class="datagridteste3105.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
            Title="MainWindow" Height="350" Width="525" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:datagridteste3105="clr-namespace:datagridteste3105">
        <Window.Resources>
            <ObjectDataProvider x:Key="PersonListDS" d:IsDataSource="True"/>
        </Window.Resources>
        <Grid>

            <TextBox Height="26" HorizontalAlignment="Left" Margin="26,0,0,12" x:Name="textBox1" VerticalAlignment="Bottom" Width="128" />
            <TextBox Height="24" Margin="188,0,98,12" x:Name="textBox2" VerticalAlignment="Bottom" />
            <Button Height="24" HorizontalAlignment="Right" Margin="0,0,20,12" x:Name="btnInsert" VerticalAlignment="Bottom" Width="63" Click="btnInsert_Click" Content="Insert"/>
            
            <DataGrid x:Name="grdDetials" HorizontalAlignment="Left" Margin="26,10,0,0" VerticalAlignment="Top" Height="227" Width="393">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}"/>
                    <DataGridTextColumn Header="LastName" Binding="{Binding Path=LastName}"/>
                </DataGrid.Columns>
            </DataGrid>

        </Grid>
    </Window>

    Pessoal alguém sabe como posso adicionar o conteúdo da textbox no datagrid?

    Sim eu fiz um código!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;


    namespace datagridteste3105
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            PersonList ListOfPersons = new PersonList();

            public MainWindow()
            {
                InitializeComponent();

                

            }

            private void btnInsert_Click(object sender, RoutedEventArgs e)
            {
                ListOfPersons.Add(new Person() { FirstName = textBox1.Text, LastName = textBox2.Text });

                painel.Visibility = Visibility;
            }
         }
        public class PersonList : ObservableCollection<Person>
        {
            public PersonList()
            {
                this.Add(new Person() { FirstName = "Coding", LastName = "Sense" });
            }
        }

        public class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }


    quarta-feira, 3 de junho de 2015 00:52
  • Você fez algum código para o botão Insert?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Sim eu fiz um código!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;


    namespace datagridteste3105
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            PersonList ListOfPersons = new PersonList();

            public MainWindow()
            {
                InitializeComponent();

                

            }

            private void btnInsert_Click(object sender, RoutedEventArgs e)
            {
                ListOfPersons.Add(new Person() { FirstName = textBox1.Text, LastName = textBox2.Text });

                painel.Visibility = Visibility;
            }
         }
        public class PersonList : ObservableCollection<Person>
        {
            public PersonList()
            {
                this.Add(new Person() { FirstName = "Coding", LastName = "Sense" });
            }
        }

        public class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }


    quarta-feira, 3 de junho de 2015 00:55
  • Mais em que momento esta adicionando os dados a grid?

    Pois para adicionar é preciso:
    grdDetails.Items.Add(new Person(){FirstName="Teste",LastName="SegundoNome"});


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    • Marcado como Resposta Moisés CS sexta-feira, 5 de junho de 2015 16:41
    quarta-feira, 3 de junho de 2015 12:23
  • Muito obrigado, MR.GMSOFT, fico muito grato pela sua sua ajuda mais um caso solucionado!
    sexta-feira, 5 de junho de 2015 16:42