Verschachtelte (verzwickte) if-Anweisung

Luky

Grünschnabel
Hi Leute,

habe ein Problem mit einer verschachtelten if-else-Anweisung.
Die if-Bedingung if (m < (k + 1)) ist true und trotzdem wird die else-Anweisung ausgeführt!
Die if-Bedingung ist fett markiert. Die Anweisung, die in der else-Bedingung ausgeführt wird, habe ich auch fett markiert.

Was ist an dieser if-else-Anweisung falsch ?


Code:
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
   int m = textBox1.TextLength;
   int k = textBox1.SelectionStart;
   string sDummy  = textBox1.Text;
        			
   if (k <= 7)
   {
      if ((k == 0) || (k == 3))
      { 
         if (m <= 7)
         { 						
	if (m < (k + 1))	{MessageBox.Show("if (m < (k + 1)) = true");} 		else
	   {
	      if (sDummy[k + 1]!= '-') 
	         {MessageBox.Show("if (sDummy[k + 1]!= '-') = true");}
	      else 	
	        {MessageBox.Show("if (sDummy[k + 1]!= '-') = false");}		   } 
         }
         else 	
            {MessageBox.Show("if (m <= 7) = false");}
         textBox1.SelectionStart = k + 2;
      }
   }
}
Überwachungsfenster
Name: Wert:
(m<(k+1)) true
m 0
k 0
 
Hallo Luky!

Habs schnell ausprobiert! Du musst den Text in der TextBox (in den Eigenschaften) im Voraus löschen, dann geht's.

Grund: Wenn das KeyPress - Ereignis ausgelöst wird, wurde die Tastatureingabe noch nicht behandelt, das heisst der bestehende Text in der TextBox wurde noch nicht mit dem neuen Zeichen ersetzt, so dass demzufolge TextLength (m) grösser als 0 ist.
Eine Alternative wäre, das "KeyUp" Ereignis zu verwenden.
 
Hi Niro99,

erst mal schönen Dank für die schnelle Hilfe. Im Überwachungsfenster wird aber doch m = 0 angezeigt. Wenn m > 0 ist, dann darf doch nur die "else-Anweisung" ausgeführt werden. Warum beide Bedingungen erfüllt sind leuchtet mir noch nicht ganz so ein.

Wo liegt der Vorteil der KeyUp-Methode gegenüber der KeyPress-Methode genau ?

mfg Luky
 
Ich treffe mal eine Annahme: Du hast "m" abgelesen, als der Debugger bei der Zeile
Code:
int m = textBox1.TextLength;
war. Dort ist m=0, aber TextLength ist ungleich null. Bei diesem Schritt ist "m" noch gar nicht zugeordnet. Wenn der Debugger einen Schritt weiter ist, sollte "m" eigentlich nicht mehr null sein...
Stimmt das?

Der "Vorteil" (oder Nachteil) des "KeyUp" Ereignisses ist wie beschrieben, dass das auslösende Ereignis bereits behandelt wurde. Konkret: Das Zeichen wird bei einem Tastendruck in die TextBox geschrieben, und dann wird das Ereignis "KeyUp" ausgelöst, welches du dann abfängst.
Bei "KeyPress" ist es umgekehrt; Das Ereignis wird bei einem Tastendruck ausglöst bevor irgendwas anderes gemacht wird, und wenn deine Methode durchgeackert wurde, wird das Zeichen in die TextBox geschrieben.

Siehst du's?
 
Hi Niro99,

nach meiner Meinung nach ist m = 0;
Ich habe das Thema mittels einer switch case -Anweisung gelöst.
Ich schreibe eine Klasse, in der in einer Textbox eine Artikel-Nr. in folgender Form einzugeben ist: x-xx-xxx (z.B. 9-25-100). Hierbei werden die Bindestriche selbstständig von meiner Methode in der Klasse gesetzt. Es werden nur Zahlen zugelassen. Ich frage einfach ab, an welcher Stelle der Curser steht und setzte dementsprechend die Zahl oder den Bindestrich. Wenn der Cursor z.B. an der Stelle "0" steht wird automatisch der Bindestrich angehangen und der Cursur um zwei Stellen nach recht verschoben. Wie gesagt, habe ich diese Klasse fertig programmiert.

In der Methode frage ich auch die Returntaste ab. Ist die Returntaste gedrückt worden und 8 Zeichen in der Textbox vorhanden, so benötige ich in einer anderen Klasse (z.B.Formular Artikelstammdatenverwaltung) ein Ereignis. Im Formular Artikelstammdatenverwaltung wird dann z.B. die Methode "SearchArtikel_InDerDatenbank" aufgerufen wenn das Ereignis ausgelöst worden ist.

Nun meine Frage:
Kann Du mir ein Beispiel liefen, das die Ereignismethoden in zwei unterschiedliche Klassen aufzeigt ?
 
Ereignise kannst du in jeder Klasse (des gleichen Namespaces) abfangen und auswerten.

Bespiel: Du hast zwei Klassen (Klasse1 & Klasse2), und du willst in Klasse1 ein Ereignis auslösen, das du in Klasse2 abfangen kannst. Dann sieht das so aus:
Code:
public class Klasse1
{
	public Klasse1()
	{
	}

	// Ereignistyp definieren
	public delegate void TestEreignis(bool);

	// Eregnisinstanz erzeugen
	public event TestEreignis testereig;
		
	// Methode, in welcher Ereignis ausgelöst wird
	public void Test()
	{
		bool wert = true;
		
		testereig(wert);		// Ereignis auslösen
	}
}

public class Klasse2
{
	public Klasse2()
	{
		// Ereignis mit Event - Handler verbinden
		kl1.testereig += new Klasse1.TestEreignis(auswerung);
	}

	// Klasseninstanz erzeugen
	Klasse1 kl1 = new Klasse1();

	// Auszuführende Methode
	private void auswertung(bool wert)
	{
		if (wert)
			MessageBox.Show("OK");
		else
			MessageBox.Show("Fehler");
	}
}
 
Moin Moin Niro99,

ich bekomme leider immer die gleiche Fehlermeldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Die Meldung erschein in der Klasse "cInputArtikelNr" in der Methode "cInputArtikelNr_KeyPress in der Zeile "InstanzReturnEreignis(true);".

Hier nun TeileCode aus der Klasse "cInputArtikelNr":
Code:
public class cInputArtikelNr	: System.Windows.Forms.TextBox
	{
		//-------------------------------------------------------------
		// Ereignistyp definieren !  
		public delegate void ReturnEreignis (bool ReturnPressed);
		// Ereignisinstanz erzeugen !
		public event ReturnEreignis InstanzReturnEreignis;
		//-------------------------------------------------------------
		private void InitializeComponent()
		{
			this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.cInputArtikelNr_KeyPress);
		}		
		public cInputArtikelNr()
		{
			InitializeComponent();
		}
		private void cInputArtikelNr_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
		{  
			// Ascii-Code ermitteln !
			int asc  = e.KeyChar;
			char cChar = (char)asc; 
			string sChar = cChar.ToString(); 			
			TextBox SenderTextBox = (TextBox) sender; 
			int m = SenderTextBox.TextLength;
			int k = SenderTextBox.SelectionStart;
			int x = 0;	// x = Stringrest, der nach dem Cursur eingelesen wird !  
			
			// Ereignis wird als quasi behandelt markiert !
			e.Handled = true;

			// ------------------------------------------------------------------------
			// Ist die Return-Taste gedrückt worden und 8 Zeichen im Textfeld vorhanden ?
			// ------------------------------------------------------------------------
			if ((asc == 13) & (SenderTextBox.TextLength == 8))
			{  	
				// Ereignis auslösen !
				if (InstanzReturnEreignis != null)
				{
					InstanzReturnEreignis(true);
				}
			}
Und nun der TeileCode aus der Klasse "fArtikelstamm":
Code:
private void fArtikelstamm_Load(object sender, System.EventArgs e)
		/*******************************************************************************************************
		Methode			:	void fArtikelstamm_Load(...)
		Ereignis			:	Aufruf durch das Laden des Formulares 								
		Eigenschaft		:	Ruft die Methode "tacArtikelstamm_SelectedIndexChanged" auf !
		-----------------------------------------------------------------------------------------
		Beschreibung	:	Setzt entsprechende Eigenschaften für das Register "Artikel"					
		*******************************************************************************************************/	
		{
			tacArtikelstamm_SelectedIndexChanged(sender, e);
			this.txtArtikelNr = new	cInputArtikelNr();
			//-----------------------------------------------------------------------------
			// Event-Handler aus der Klasse "cInputArtikelNr"
			//-----------------------------------------------------------------------------
			// Klasseninstanz erzeugen !
			cInputArtikelNr MyClass = new cInputArtikelNr();
			// Ereignis mit Event-Handler verbinden !
			MyClass.InstanzReturnEreignis += new cInputArtikelNr.ReturnEreignis(EventHandlerReturnTaste);
			//-----------------------------------------------------------------------------
		}
		private void EventHandlerReturnTaste(bool ReturnPressed)
		/*******************************************************************************************************
		Methode			:	void EventHandlerReturnTaste(...)
		Ereignis		:	Aufruf durch das Drücken der Returntaste in der Klasse "cInputArtikelNr" 								
		Eigenschaft		:	ReturnPressed = true  (Returntaste gedrückt und 8 Zeichen in der Textbox)
							ReturnPressed = false (Returntaste gedrückt und < 8 Zeichen in der Textbox)
		-----------------------------------------------------------------------------------------
		Beschreibung	:	ReturnPressed = true => Aufruf der Methode "SearchArtikelInDatabase"
		*******************************************************************************************************/	
		{
			if (ReturnPressed)
				{MessageBox.Show("Returntaste ist gedückt worden");}
			else
				{MessageBox.Show("Unerklärlicher Fehler");}
		}
Was mache ich da falsch ?

mfg Luky
 
Zurück