none
Wie ich erstelle ich mit C# einen Kassenbon Textformat am besten? RRS feed

  • Frage

  • Hallo,

    ich möchte einen Kassenbon erstellen. Ich habe bisher alle Daten/Text die auf dem Kassenbon erscheinen soll. 

    Die Daten sind:

    - Kunden Datenbank

    - Combox auf dem man eine Menü 1 oder Produkt wählen kann und dessen der Preis in einem Textbox angezeigt wird.

    Jetzt möchte ich die gewählte Kunde und das Gewählte Produkt + Preis in einem Textbox/Groupbox/listbox/listview darstellen.

    Ich weiß gar nicht welche von den Textbox/Groupbox/listbox/listview benutzen, weil ich die Ausgabe so formatiert haben möchte:

    Menü 1                   3,35 €
    Menü 3                   8,25 €
    Menü 4                   5,00 €
    
    Summe                   16,60 €

    Sozusagen das die gewählte menü auf der linke(linksbündig) Seite erscheinen und der Preis auf der rechteseite(rechtsbündig)

    Wie könnte ich das realisieren?

    Grüße TaMBeY




    • Bearbeitet TaMBeY Montag, 3. November 2014 09:43
    Montag, 3. November 2014 09:28

Antworten

  • Hi,
    mit dem DataGridView kannst Du das problemlos machen. Nachfolgend eine kleines Demo:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Linq;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form3 : Form
      {
        public Form3()
        {
          InitializeComponent();
        }
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
          List<Ausgabe> kasse = new List<Ausgabe>() { new Ausgabe() { Menue = "Menue 1", Preis = 3.35m }, 
            new Ausgabe() { Menue = "Menue 3", Preis = 8.25m }, 
            new Ausgabe() { Menue = "Menue 4", Preis = 5m },
            new Ausgabe()};
          kasse.Add(new Ausgabe() { Menue = "Summe", Preis = kasse.Sum<Ausgabe>(c => c.Preis) });
          DataGridView grd = new DataGridView() { Dock = DockStyle.Fill, AutoGenerateColumns=false };
          grd.SuspendLayout();
          grd.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "Menü", DataPropertyName = "Menue" });
          grd.Columns.Add(new DataGridViewTextBoxColumn()
          {
            HeaderText = "Preis",
            DataPropertyName = "Preis",
            DefaultCellStyle = new DataGridViewCellStyle() { Format = "C2", Alignment = DataGridViewContentAlignment.MiddleRight, NullValue="" },
            
          });
          this.Controls.Add(grd);
          grd.DataSource = kasse;
          grd.ResumeLayout();
        }
        class Ausgabe
        {
          public string Menue { get; set; }
          public decimal? Preis { get; set; }
        }
      }
    }
    

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Montag, 3. November 2014 10:34
  • Hi,

    wenn du kein DataGridView nutzen möchtest (was nur eine von vielen Möglichkeiten ist) kannst du deine Stringbuilder Variablen auch per PrintDocument (Klasse in NET) ausdrucken. 

    ein Beispiel

    Der Vorteil von Peters Vorschlag ist das die Formatierung viel einfacher wird. Die Frage ist auch ob die Belege gespeichert werden müssen, normalerweise ist das so. Wenn ja ist die Frage wie und wo... als Textfile -> dann könntest du formatierte Textfiles erzeugen und drucken oder in einer Datenbank. Eine weitere Möglichkeit wäre der ReportViewer in NET. Ohne Hintergrund ist es aber schwer zu entscheiden was das richtige sein könnte. Erkläre mal ob das nur just for fun ist oder ein richtiges Projekt ist wie bspw. eine Kassensoftware.

    Gruß


    Jens Gerber

    Montag, 3. November 2014 20:47
  • Hi,
    wenn Du ohne Oberflächen-Elemente arbeiten willst und nur mit dem StringBuilder, dann kann der folgende Codeschnipsel dienen, Wichtig dabei ist, dass die Ausgabe mit einem nicht-proportionalen Zeichensatz ausgeführt wird.

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Linq;
    using System.Text;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form3 : Form
      {
        public Form3()
        {
          InitializeComponent();
        }
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
          List<Ausgabe> kasse = new List<Ausgabe>() { new Ausgabe() { Menue = "Menue 1", Preis = 3.35m }, 
            new Ausgabe() { Menue = "Menue 3", Preis = 8.25m }, 
            new Ausgabe() { Menue = "Menue 4", Preis = 5m },
            new Ausgabe()};
          kasse.Add(new Ausgabe() { Menue = "Summe", Preis = kasse.Sum<Ausgabe>(c => c.Preis) });
    //
          StringBuilder sb = new StringBuilder();
          foreach (var item in kasse)
          {
            sb.Append(string.Format("{0,-10} {1,10:C2}{2}", item.Menue, item.Preis, Environment.NewLine));
          }
          TextBox tb = new TextBox() { Multiline = true, Height = 100, Width = 200, Font = new System.Drawing.Font("Courier New", 10) };
          tb.Text = sb.ToString();
          this.Controls.Add(tb);
        }
        class Ausgabe
        {
          public string Menue { get; set; }
          public decimal? Preis { get; set; }
        }
      }
    }

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Dienstag, 4. November 2014 17:34

Alle Antworten

  • Hi,
    mit dem DataGridView kannst Du das problemlos machen. Nachfolgend eine kleines Demo:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Linq;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form3 : Form
      {
        public Form3()
        {
          InitializeComponent();
        }
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
          List<Ausgabe> kasse = new List<Ausgabe>() { new Ausgabe() { Menue = "Menue 1", Preis = 3.35m }, 
            new Ausgabe() { Menue = "Menue 3", Preis = 8.25m }, 
            new Ausgabe() { Menue = "Menue 4", Preis = 5m },
            new Ausgabe()};
          kasse.Add(new Ausgabe() { Menue = "Summe", Preis = kasse.Sum<Ausgabe>(c => c.Preis) });
          DataGridView grd = new DataGridView() { Dock = DockStyle.Fill, AutoGenerateColumns=false };
          grd.SuspendLayout();
          grd.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "Menü", DataPropertyName = "Menue" });
          grd.Columns.Add(new DataGridViewTextBoxColumn()
          {
            HeaderText = "Preis",
            DataPropertyName = "Preis",
            DefaultCellStyle = new DataGridViewCellStyle() { Format = "C2", Alignment = DataGridViewContentAlignment.MiddleRight, NullValue="" },
            
          });
          this.Controls.Add(grd);
          grd.DataSource = kasse;
          grd.ResumeLayout();
        }
        class Ausgabe
        {
          public string Menue { get; set; }
          public decimal? Preis { get; set; }
        }
      }
    }
    

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Montag, 3. November 2014 10:34
  • geht das den auch ohne Tabelle?
    Montag, 3. November 2014 13:08
  • Hi,
    Bitte beschreibe genauer, welche Techniken Du für den Bondrucker nutzen kannst/willst.

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Montag, 3. November 2014 16:17
  • Also,

    ich habe eine Kunden-Datenbank. Gebe die ID der Kunde die in der Tabelle eingetragen ist und schreibe ich eine Stringbuilder Variable.

    Danach Wähle ich eine Menü aus ComboBox und lasse das berechnete Preis in eine Textbox schreiben. Die Werte werden ebenfalls in die Stringbuilder Variable rein geschrieben.

    Ich möchte jetzt als letztens die Werte in der Stringbuilder Variable so Formatiert haben: 

    Menü 1     12,0 €
    
    Menü 2     13,25 €
    
    Summe      25,25 €


    Das einzige was fehlt ist die Formatierte Ausgabe wie Oben.

    Danke für deine Hilfe Peter.


    • Bearbeitet TaMBeY Montag, 3. November 2014 20:23
    Montag, 3. November 2014 20:01
  • Hi,

    wenn du kein DataGridView nutzen möchtest (was nur eine von vielen Möglichkeiten ist) kannst du deine Stringbuilder Variablen auch per PrintDocument (Klasse in NET) ausdrucken. 

    ein Beispiel

    Der Vorteil von Peters Vorschlag ist das die Formatierung viel einfacher wird. Die Frage ist auch ob die Belege gespeichert werden müssen, normalerweise ist das so. Wenn ja ist die Frage wie und wo... als Textfile -> dann könntest du formatierte Textfiles erzeugen und drucken oder in einer Datenbank. Eine weitere Möglichkeit wäre der ReportViewer in NET. Ohne Hintergrund ist es aber schwer zu entscheiden was das richtige sein könnte. Erkläre mal ob das nur just for fun ist oder ein richtiges Projekt ist wie bspw. eine Kassensoftware.

    Gruß


    Jens Gerber

    Montag, 3. November 2014 20:47
  • Hi,
    wenn Du ohne Oberflächen-Elemente arbeiten willst und nur mit dem StringBuilder, dann kann der folgende Codeschnipsel dienen, Wichtig dabei ist, dass die Ausgabe mit einem nicht-proportionalen Zeichensatz ausgeführt wird.

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Linq;
    using System.Text;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form3 : Form
      {
        public Form3()
        {
          InitializeComponent();
        }
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
          List<Ausgabe> kasse = new List<Ausgabe>() { new Ausgabe() { Menue = "Menue 1", Preis = 3.35m }, 
            new Ausgabe() { Menue = "Menue 3", Preis = 8.25m }, 
            new Ausgabe() { Menue = "Menue 4", Preis = 5m },
            new Ausgabe()};
          kasse.Add(new Ausgabe() { Menue = "Summe", Preis = kasse.Sum<Ausgabe>(c => c.Preis) });
    //
          StringBuilder sb = new StringBuilder();
          foreach (var item in kasse)
          {
            sb.Append(string.Format("{0,-10} {1,10:C2}{2}", item.Menue, item.Preis, Environment.NewLine));
          }
          TextBox tb = new TextBox() { Multiline = true, Height = 100, Width = 200, Font = new System.Drawing.Font("Courier New", 10) };
          tb.Text = sb.ToString();
          this.Controls.Add(tb);
        }
        class Ausgabe
        {
          public string Menue { get; set; }
          public decimal? Preis { get; set; }
        }
      }
    }

    --
    Peter
    Meine Homepage mit Tipps und Tricks

    Dienstag, 4. November 2014 17:34
  • Danke vielmals für eure Hilfe und mühe.
    Mittwoch, 5. November 2014 13:40