none
Lexikon erstellen

    Frage

  • Hallo zusammen, 

    ich bin ein Anfänger und versuche für mich ein privates Lexikon zu erstellen. Indem ich ein Begriff in eine Textbox eingebe und auf Search(Button) drücke und eine Ausgabe erhalte. Ich bekomme bei meiner Version aber immer wieder den letzten Text angezeigt. Kann mir da jemand bitte helfen. 

    namespace WindowsFormsApp1
    {
    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		string lukulent, obsolet, Unredlichkeit;
    
    		private void txtfremdwort_TextChanged(object sender, EventArgs e)
    		{
    			lukulent = ("lichtklar, voll");
    			obsolet = ("nicht mehr gegebräuchlich; nicht mehr üblich; veraltet; überflüssig");
    			Unredlichkeit = ("Ist ein Verhalten, dass betrügerisch, unehrlich, unaurfichtig ist.");
    
    		}
    
    		private void cmdpush_Click(object sender, EventArgs e)
    		{
    			lblAusgabe.Text = lukulent;
    			lblAusgabe.Text = obsolet;
    			lblAusgabe.Text = Unredlichkeit;
    
    			
    		}
    	}
    }
    

    Danke. 
    Grüße midatra

    Donnerstag, 21. Dezember 2017 12:08

Antworten

  • Hallo,

    vielleicht hilft dir dieses Beispiel etwas weiter. Ein Dictionary ist eine Liste von Schlüssel/Wert-Paaren, die erst einmal einfach zu durchsuchen ist. Im Beispiel wurde es so gewählt, das Groß/Kleinschreibung keine Rolle spielen. Wird ein "Wort" nicht gefunden, wird geprüft, ob es Wörter gibt, die das Suchwort als Teil enthalten.

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace FormDesigner {
      public partial class Form1 : Form {
        private Dictionary<string, string> Wörterbuch;
        public Form1() {
          InitializeComponent();
          txtfremdwort.KeyUp += Txtfremdwort_KeyUp;
          cmdpush.Click += Cmdpush_Click;
          Wörterbuch = LadeWörterbuch();
        }
    
        // Startet die Suche...
        private void Cmdpush_Click(object sender, EventArgs e) {
          SetLabel(Suche(txtfremdwort.Text));
        }
    
        // Bei "Enter" während der Eingabe direkt suchen...
        private void Txtfremdwort_KeyUp(object sender, KeyEventArgs e) {
          if ( e.KeyCode == Keys.Enter )
            SetLabel(Suche(txtfremdwort.Text));
        }
    
        // Text an das Label-Control weiterreichen...
        private void SetLabel(string fundstelle) {
          if ( !string.IsNullOrWhiteSpace(fundstelle) ) {
            lblAusgabe.BackColor = System.Drawing.Color.White;
            lblAusgabe.Text = fundstelle;
          } else {
            lblAusgabe.BackColor = System.Drawing.Color.MistyRose;
            lblAusgabe.Text = "Keine Informationen vorhanden.";
          }
        }
    
        // Sucht nach einem Wort. 
        private string Suche(string suche) {
          suche = suche.ToLower();
          string ergebnis = string.Empty;
          Wörterbuch.TryGetValue(suche, out ergebnis);
          if ( string.IsNullOrWhiteSpace(ergebnis) ) {
            ergebnis = SucheContains(suche);
          }
          return ergebnis;
        }
    
        // Liefert Ergebnis, wenn das Suchwort im Key enthalten ist...
        private string SucheContains(string suche) {
          suche = suche.ToLower();
          string nl = Environment.NewLine; 
          return string.Join(Environment.NewLine, 
            Wörterbuch
              .Where(kvp => kvp.Key.Contains(suche))
              .Select(kvp => $"{kvp.Key}:{nl}    {kvp.Value}{nl}")
              .ToArray());
        }
    
        // Diese Methode ist dafür zuständig, das Wörterbuch zu initialisieren.
        private Dictionary<string, string> LadeWörterbuch() {
          Dictionary<string, string> wb = new Dictionary<string, string>();
          NeuerEintrag(wb, "lukulent", "lichtklar, voll");
          NeuerEintrag(wb, "obsolet", "nicht mehr gegebräuchlich; nicht mehr üblich; veraltet; überflüssig");
          NeuerEintrag(wb, "Unredlichkeit", "Ist ein Verhalten, dass betrügerisch, unehrlich, unaurfichtig ist.");
          return wb;
        }
    
        // Einen neuen Eintrag zum Wörterbuch hinzufügen, ggf. aktualisieren...
        private void NeuerEintrag(Dictionary<string, string> wörterbuch,
          string key, string value, bool aktualisieren = true) {
          if ( string.IsNullOrWhiteSpace(key) ||
            string.IsNullOrWhiteSpace(value) ||
            wörterbuch == null ) {
            throw new ArgumentNullException();
          }
          key = key.ToLower(); // wandelt die Zeichen in Kleinbuchstaben um...
          if ( wörterbuch.ContainsKey(key) && !aktualisieren ) {
            throw new ArgumentException($"Schlüssel bereits vorhanden {key}");
          }
          wörterbuch[key] = value.Trim();
        }
      }
    }

    Noch ein paar Empfehlungen für den Anfang:

    1.) Die Methoden, die Ereignisse der Controls behandeln (z.B. Button_Click...), sollten möglichst wenig Code enthalten. Das, was passieren soll, immer in eine eigene Methode verlagern.

    2.) Änderungen an den Werten eines Controls (z.B. der Text-Eigenschaft des Labels), sollten auch jeweils über eine eigene Methode passieren.

    3.) Die Akquise und Bearbeitung der Daten (...des Wörterbuchs) sollte auch in eigenen Methoden umgesetzt werden.

    Gruß

    Donnerstag, 21. Dezember 2017 20:56

Alle Antworten

  • Hi,

    ist ja auch kein Wunder. Du weist lblAusgabe.Text drei mal einen Wert zu. Der zuerst zugewiesene Wert wird daher also von der zweiten Zuweisung überschrieben, die dann wiederum von der dritten Zuweisung.

    Was man in deinem Code ändern sollte, kann ich dir nicht sagen, da ich nicht wirklich verstanden habe, was da bei dir wo und wie gesucht und ausgegeben werden soll. Beschreib das mal bitte genauer.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 21. Dezember 2017 12:11
    Moderator
  • Hallo, 

    ich möchte ein Fremdwortlexikon anlegen. Indem ich ein Wort z. B. "obsolet" in eine Textbox eingebe, dann auf ein Button drücke und die Definition erhalte als Text.

    Donnerstag, 21. Dezember 2017 18:26
  • Hallo,

    vielleicht hilft dir dieses Beispiel etwas weiter. Ein Dictionary ist eine Liste von Schlüssel/Wert-Paaren, die erst einmal einfach zu durchsuchen ist. Im Beispiel wurde es so gewählt, das Groß/Kleinschreibung keine Rolle spielen. Wird ein "Wort" nicht gefunden, wird geprüft, ob es Wörter gibt, die das Suchwort als Teil enthalten.

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace FormDesigner {
      public partial class Form1 : Form {
        private Dictionary<string, string> Wörterbuch;
        public Form1() {
          InitializeComponent();
          txtfremdwort.KeyUp += Txtfremdwort_KeyUp;
          cmdpush.Click += Cmdpush_Click;
          Wörterbuch = LadeWörterbuch();
        }
    
        // Startet die Suche...
        private void Cmdpush_Click(object sender, EventArgs e) {
          SetLabel(Suche(txtfremdwort.Text));
        }
    
        // Bei "Enter" während der Eingabe direkt suchen...
        private void Txtfremdwort_KeyUp(object sender, KeyEventArgs e) {
          if ( e.KeyCode == Keys.Enter )
            SetLabel(Suche(txtfremdwort.Text));
        }
    
        // Text an das Label-Control weiterreichen...
        private void SetLabel(string fundstelle) {
          if ( !string.IsNullOrWhiteSpace(fundstelle) ) {
            lblAusgabe.BackColor = System.Drawing.Color.White;
            lblAusgabe.Text = fundstelle;
          } else {
            lblAusgabe.BackColor = System.Drawing.Color.MistyRose;
            lblAusgabe.Text = "Keine Informationen vorhanden.";
          }
        }
    
        // Sucht nach einem Wort. 
        private string Suche(string suche) {
          suche = suche.ToLower();
          string ergebnis = string.Empty;
          Wörterbuch.TryGetValue(suche, out ergebnis);
          if ( string.IsNullOrWhiteSpace(ergebnis) ) {
            ergebnis = SucheContains(suche);
          }
          return ergebnis;
        }
    
        // Liefert Ergebnis, wenn das Suchwort im Key enthalten ist...
        private string SucheContains(string suche) {
          suche = suche.ToLower();
          string nl = Environment.NewLine; 
          return string.Join(Environment.NewLine, 
            Wörterbuch
              .Where(kvp => kvp.Key.Contains(suche))
              .Select(kvp => $"{kvp.Key}:{nl}    {kvp.Value}{nl}")
              .ToArray());
        }
    
        // Diese Methode ist dafür zuständig, das Wörterbuch zu initialisieren.
        private Dictionary<string, string> LadeWörterbuch() {
          Dictionary<string, string> wb = new Dictionary<string, string>();
          NeuerEintrag(wb, "lukulent", "lichtklar, voll");
          NeuerEintrag(wb, "obsolet", "nicht mehr gegebräuchlich; nicht mehr üblich; veraltet; überflüssig");
          NeuerEintrag(wb, "Unredlichkeit", "Ist ein Verhalten, dass betrügerisch, unehrlich, unaurfichtig ist.");
          return wb;
        }
    
        // Einen neuen Eintrag zum Wörterbuch hinzufügen, ggf. aktualisieren...
        private void NeuerEintrag(Dictionary<string, string> wörterbuch,
          string key, string value, bool aktualisieren = true) {
          if ( string.IsNullOrWhiteSpace(key) ||
            string.IsNullOrWhiteSpace(value) ||
            wörterbuch == null ) {
            throw new ArgumentNullException();
          }
          key = key.ToLower(); // wandelt die Zeichen in Kleinbuchstaben um...
          if ( wörterbuch.ContainsKey(key) && !aktualisieren ) {
            throw new ArgumentException($"Schlüssel bereits vorhanden {key}");
          }
          wörterbuch[key] = value.Trim();
        }
      }
    }

    Noch ein paar Empfehlungen für den Anfang:

    1.) Die Methoden, die Ereignisse der Controls behandeln (z.B. Button_Click...), sollten möglichst wenig Code enthalten. Das, was passieren soll, immer in eine eigene Methode verlagern.

    2.) Änderungen an den Werten eines Controls (z.B. der Text-Eigenschaft des Labels), sollten auch jeweils über eine eigene Methode passieren.

    3.) Die Akquise und Bearbeitung der Daten (...des Wörterbuchs) sollte auch in eigenen Methoden umgesetzt werden.

    Gruß

    Donnerstag, 21. Dezember 2017 20:56
  • Hi Pater,

    danke für deine ausführliche Hilfe.

    Es ist doch ein bisschen mehr als ich gedacht habe. 

    Gruß

    Donnerstag, 21. Dezember 2017 21:23
  • Nochmals Danke. Funktioniert wie gewünscht. 

    Grüße midatra

    Mittwoch, 3. Januar 2018 19:34