TextBox Eingabeüberprüfung

der_Brain

Grünschnabel
hallo zusammen

ich habe mir eine TextBox gebaut die Eingaben überprüft, und wenn die Eingaben vom Typ "Char" sind, dann erscheint eine Fehlermeldung.

Code:
public class LetterAndDigitTextBox: TextBox
	{
		// Aufzählung und Eigenschaft, die den Eingabetyp festlegen
		public enum InputTypeEnum
		{
			Integer,
			Char
		}
		
		private InputTypeEnum inputType = InputTypeEnum.Integer;

		// definiert, welche Eingaben die TextBox zulässt
		public InputTypeEnum InputType
		{
			get {return this.inputType;}
			set {this.inputType = value;}
		}

		// Ereignis für Eingabefehlermeldungen
		// wird aufgerufen, wenn eine Eingabe nicht dem Schema entspricht
		public delegate void InvalidInputHandler(string invalidText);
		public event InvalidInputHandler InvalidInput;

		// Methode zum Überprüfen, ob die Eingabe in Ordnung ist
		private bool inputValid(string input)
		{
			switch (this.inputType)
			{
				case InputTypeEnum.Integer: 
					try 
					{
						Convert.ToInt64(input);			
						return true;
					}
					catch 
					{
						if (InvalidInput != null) InvalidInput(input);
						return false;
					}

				default: // InputTypeEnum.Char
					try
					{
//												Convert.ToChar(input);
						return true;
					}
					catch
					{
						if(InvalidInput != null) InvalidInput(input);
						return false;
					}
			}
		}


		// Überschreiben der Text-Eigenschaft
		public override string Text
		{
			get {return base.Text;}
			set
			{
				if (this.inputValid(value))
					base.Text = value;
			}
		}

		// Überschreiben der OnKeyPress-Methode zum Überprüfen von Tastatureingaben
		protected override void OnKeyPress(KeyPressEventArgs kpea)
		{
			if (Char.IsControl(kpea.KeyChar) == false)
			{
				// Den potenziell neuen Text zusammensetzen
				string newText = base.Text.Substring(0, base.SelectionStart)
					+ kpea.KeyChar.ToString() + base.Text.Substring(
					base.SelectionStart + base.SelectionLength);
				
				if (this.inputValid(newText) == false)
					// Die Eingabe führt zu einem ungültigen Ergebnis,
					// also verwerfen
					kpea.Handled = true;
			}
			
			base.OnKeyPress(kpea);
		}

		protected override void WndProc(ref Message m)
		{
			int msg = m.Msg;
			   
			base.WndProc(ref m);
		}
		

		// Überschreiben der ProcessCmdKey-Methode zum Abfangen der
		// Tastenkombinationen für das Einfügen von Daten 
		protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
		{
			if (keyData == (Keys)Shortcut.CtrlV || 
				keyData == (Keys)Shortcut.ShiftIns)
			{
				// Daten aus der Zwischenablage auslesen
				IDataObject iData = Clipboard.GetDataObject();
 
				// Die neuen Daten mit dem Text außerhalb der aktuellen Auswahl
				// verknüpfen um den neuen Text zu erhalten
				string newText = base.Text.Substring(0, base.SelectionStart) +
					(string)iData.GetData(DataFormats.Text) +
					base.Text.Substring(base.SelectionStart +
					base.SelectionLength);

				// Den potenziell neuen Text überprüfen
				if (this.inputValid(newText) == false)
					// Beenden und true zurückgeben, um die Verarbeitung
					// abzuschließen
					return true; 
			}
         
			return base.ProcessCmdKey(ref msg, keyData);
		}
	}

das problem was ich jetzt habe ist das ich eigentlich nur alle zeichen ausschließen will die nicht als Ordnername fungieren können wie (, ), /... und so weiter

ich hab schon versucht mir ein array zu bauen und dann verglichen ob die zeichen in dem array liegen, hat aber alles nicht so gefunzt.

hat da also jemand eine kluge idee wie ich Ordner-"illegale" zeichen blocke?

mfg
der_Brain
 
Code:
using System;
using System.Windows.Forms;

public class Form1: Form
{
    public Form1()
    {
        // Create a TextBox control.
        TextBox tb = new TextBox();
        this.Controls.Add(tb);
        tb.KeyPress += new KeyPressEventHandler(keypressed);
    }

    void keypressed(Object o, KeyPressEventArgs e)
    {
        // The keypressed method uses the KeyChar property to check 
        // whether the ENTER key is pressed. 

        // If the ENTER key is pressed, the Handled property is set to true, 
        // to indicate the event is handled.
        if(e.KeyChar == (char)13)
            e.Handled=true;
    }

    public static void Main()
    {
        Application.Run(new Form1());
    }
}
So stehts in der Hilfe zum VS. In der Zeile:

if(e.KeyChar == (char)13) .....;

Müßtest Du für jedes nicht erlaubte Zeichen die Abfrage machen. Man kann die Abfrage in VB.NET mit "OR" verknüpfen, also ist die gedrückte Taste "?" ODER ist sie "/" dann... Ich kenne leider nicht den passenden OR-Operator für C#, müßtest Du mal suchen. In VB würde die Zeile dann in etwa so aussehen:

If e.KeyChar = CChar(xx) OR e.KeyChar = CChar(xx) OR e.KeyC ....... usw.

wobei xx für den jeweiligen ASCII-Code steht.
Außerdem solltest Du anstatt des KeyPressed-Ereignis, das KeyDown-Ereignis verwenden, weil bei KeyPressed die Taste schon wieder losgelassen wurde.

Du mußt dann einfach sagen: Wenn ein falsches Zeichen gedrückt wurde, verlasse die Routine ohne ein Zeichen auszugeben ELSE gib Zeichen aus...

MfG
..::SD::..
 
Jede einzelne Eingabe mit einem Array checken, oder erst beim Verlassen des Feldes überpüfen.

Ausserdem musst Du Dir ein entsprechendes Array nicht mehr zusammenbauen, gibts eigentlich schon.

hier
 
So etwas könnte man auch folgendermaßen ganz einfach und gut lösen:

Code:
private void textBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
	if( "\\/:*?\"<>|".IndexOf( e.KeyChar ) != -1 )
	{
		e.Handled = true;
	}
}

mfG,
MAN
 
Zurück