Laden...

Enter/Eingabe statt Tab Taste...

Erstellt von Timur Zanagar vor 19 Jahren Letzter Beitrag vor 14 Jahren 22.494 Views
Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 19 Jahren
Enter/Eingabe statt Tab Taste...

Hallo an alle,

Es gibt die Möglichkeit bei einer Windows Forms die Tab-Reihenfolge zu bestimmen um bei der Eingabe mit Tab alle Eingabefelder durchzugehen.

Gibt es eine Möglichkeit eine andere Taste, z.B. die Enter/Eingabe Taste zu benutzen? Und wenn ja, wie wird so etwas realisiert?

Vielen Dank im Voraus.

D
279 Beiträge seit 2004
vor 19 Jahren

Hallo,
Um die Tab-Reihenfolge festzulegen, hat fast jedes Control eine TabIndex Eigenschaft.

Willst du die Enter-Tase anstatt die Tab-Tase benutzen oder was hast du genau vor?
Es gibt eine Default-Button Property der Form, der du einen Button zuweisen kannst. Immer wenn du dann die 'Enter'-Tase drückst, wird dieser Button geklickt.

Ansonsten müsstest du denke ich das Drücken der Enter-Tase manuell abfangen und dann spezifisch darauf reagieren.

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 19 Jahren

Hallo,

vielen Dank für die Information.

Sorry das ich mich nicht klar ausgedrückt habe. Es ging nicht um den TabIndex sondern um den auszulösende Taste.

Ich habe gerade eben nach dem "Default-Button" Property geschaut, wurde aber nicht fündig.

Gibt es keine andere Möglichkeit anstatt die Taste abzufangen?

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo burning snow,

ich würde erstmal dafür plädieren, das Standard-Tasten wie Enter, Tab u.ä. ihre normale Funktion behalten. Also Tab für das Springen und Enter für das Aktivieren des DefaultButtons. Es muss m.E. schon sehr handfeste Gründe geben, dass zu ändern. Unbekannte Windows-Anwendungen sind ja auch deshalb so "leicht" zu bedienen, weil es eben gewisse Standards und Konvetionen gibt.

Sollte bei Dir so ein handfester Grund vorliegen, kriegst Du das Betätigen der Enter-Taste in den Ereignissen Control.KeyDown bzw. KeyPress bzw. KeyUp mit und kannst es dort entsprechend behanden.

HTH

herbivore

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 19 Jahren

Vielen Dank für den Hinweis. Es ist mir klar das es gewisse Standards gibt bei der Entwicklung. Nur geht es hierbei um eine Anwendung mit der man dann zwischen der Tab Taste und der Enter Taste wählen kann, da es Kunden gibt, die sich von der DOS Zeit her daran gewöhnt haben die Enter Taste zu benutzen.

S
58 Beiträge seit 2004
vor 19 Jahren

Original von burning snow
Vielen Dank für den Hinweis. Es ist mir klar das es gewisse Standards gibt bei der Entwicklung. Nur geht es hierbei um eine Anwendung mit der man dann zwischen der Tab Taste und der Enter Taste wählen kann, da es Kunden gibt, die sich von der DOS Zeit her daran gewöhnt haben die Enter Taste zu benutzen.

DOS -> was in aller welt ist DOS G

ne scherz bei seite

du eventhandler auf tasten legen und wenns dann halt die enter taste ist, dann springst du mit dem fokus in nächste textfeld

wer fehler findet, darf sie behalten

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 19 Jahren

Vielen Dank für eure Antworten. Ich glaube ich werde einfach den User dazu trimmen die TAB Taste zu benutzen 🙂

S
58 Beiträge seit 2004
vor 19 Jahren

tja ist wohl die einfachste lösung

wer fehler findet, darf sie behalten

N
47 Beiträge seit 2004
vor 19 Jahren

wobei es sicher auch seine Berechtigung hat, mit der Entertaste die Textboxen zu wechseln. Daher Anbei dieser Eventhandler welche ich selber zum selben Zweck nutze:


private void eingabeFilter(object , KeyPressEventArgs e)
{
TextBox tbox = (TextBox) sender;
int taste = (int) e.KeyChar;
switch(taste)
{
// nur diese Zeichen (Eingabe, Rücktaste, Komma und 0 bis 9) sind zugelasssen:
case 8:break; case 44: break; case 48:break; case 49:break; case 50:break;
case 51:break; case 52: break; case 53:break; case 54:break; case 55:break;
case 56:break; case 57: break; case 13: break;
// alle anderen Zeichen werden von Ereignisbehandlung ausgeschlossen:
default:
e.Handled = true; break; // Ereignis wird als quasi behandelt markiert
}
if(e.KeyChar == '.') tbox.AppendText(",";);
if(taste == 13)// wenn die Enter-Taste gedrückt wurde
this.SelectNextControl(this.ActiveControl,true,true,true,true);
}

T
506 Beiträge seit 2005
vor 18 Jahren

Hallo

wie kann ich, wenn ich z.b bei dieser Funktion anstatt ein sprung zum nächsten controll möchte, ein buttonlick, den ich bereits definert habe, auslösen?

greetz

N
4.644 Beiträge seit 2004
vor 18 Jahren

deinButton.PerformClick();

T
506 Beiträge seit 2005
vor 18 Jahren

ist dies der richtige code, um den fokus einem beliebigen button zuzuordnen?

this.SelectNextControl(this.button2, true, true, true, true);

in meinem fall jetzt button2

und wie kann ich, wenn ich zwei forms habe, von der form 1 starte ich die form2, da korigiere ich eine textbox von form1. wenn ich dann da OK drücke, soll mir der fokus in der form1 auf den nächsten button springen. wie kann ich das machen?
greetz

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo torkel,

den Fokus setzt man mit Control.Focus. So kannst du das auch in dem Fall mit zwei Forms machen. Du musst nur mit bekommen, wann Form2 geschlossen wird. Wenn Form2 mit ShowDialog geöffnet wurde, ist das der Fall, sobald ShowDialog zurückkehrt. Wenn Form2 mit Show angezeigt wurde, musst du vor dem Anzeigen einen EventHandler für das Closed-Event von Form2 eintragen.

herbivore

T
506 Beiträge seit 2005
vor 18 Jahren

hej

kannst du mir ein beispiel-code machen? ich bring es nicht zum laufen, finde Control.Focus nicht.

greetz

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo torkel,

was heißt Control.Focus nicht finden? Nicht in der Doku? Da steht es drin.

Wenn es der Designer o.ä. nicht anzeigt, lass dich nicht verunsichern. Schreib es einfach direkt in den Code, z.B.:


TextBox tbx = new TextBox ();
tbx.Focus ();

herbivore

T
506 Beiträge seit 2005
vor 18 Jahren

wie kann ich denn wenn ich diesen Button drücke:

 private void button1_Click(object sender, EventArgs e)
        {
            this.form1.Id = Convert.ToDecimal(textBox1.Text);
            this.Close();
        }

wie kann ich da den focus auf ein Button einer andern form, z.b Hauptform.cs setzen?

mfg

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo torkel,

ich habe ja schon oben geschrieben, wie Form1 mitbekommen kann, dass Form2 geschlossen wird. An dieser Stelle, kann Form1 dann den Focus auf ein eigenes Control setzen. Also m.E. kein Bedarf den Focus auf ein Control eines anderen Forms zu setzen.

herbivore

T
506 Beiträge seit 2005
vor 18 Jahren

Hallo herbivore

ja, du hast geschrieben, dass ich ein closed eventhandler aufrufen muss, bevor ich die From 2 starte mit .show().

aber ich finde diesen FormClosed event nur in der From2 in VS2005.

greetz

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo torkel,

ich habe geschrieben, dass du einen EventHandler eintragen (also registrieren) musst:


form2.Closed += new EventHandler (Form2_Closed);

Aufgerufen wird er dann automatisch beim Schließen von Form2.

Den Closed-Event gibt es für alle Forms, wobei Form2 ja hier richtig ist und ausreicht. Wenn der Designer etwas nicht anzeigt/anbietet, schreib es einfach direkt in den Code.

herbivore

T
506 Beiträge seit 2005
vor 18 Jahren

ich glaube ich mache was grundlegendes falsch!

wenn ich jetzt dies vor .show() einfüge, bringt er mir immer diesen fehler:

The name 'form2_Closed' does not exist in the current context

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo torkel,

du musst natürlich noch einen entsprechenden EventHandler schreiben:


protected void Form2_Closed (Object objSender, EventArgs ea)
{
   // hier den Focus umsetzen
}

herbivore

T
506 Beiträge seit 2005
vor 18 Jahren

ah ok... langsam seh ich wie die Sache funktioniert...

hat geklappt.. super

Z
457 Beiträge seit 2007
vor 15 Jahren

Um nach langer Zeit mal wieder zum Ursprung zurück zu kehren.

Ich versuche gerade hinzubekommen, dass mit Enter das nächste Feld in der Tabreihenfolge angesteuert wird. Ich fange dazu das KeyUp Event ab und verwende dann die SelectNextControl() Methode. Im grunde funktioniert das auch. Mein Problem ist jetzt, dass ich UserControls habe auf die SetNextControl anscheinend nicht funktioniert obwohl mit Tab ohne probleme geht und die Methode ja expliziet anbietet durch Child-Controls zu stepen.


public class BaseForm : Form
{
	protected BaseForm() {
		KeyUp += SetNextControlByEnter;
		KeyPreview = true;
	}

	protected void SetNextControlByEnter(object sender, KeyEventArgs e) {
		if(e.KeyData  == Keys.Enter) {
			SelectNextControl(this, true, false, true, true);
		}
	}
}

Kennt jemand eine Lösung für das Problem?

mfg
Zebes

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo @All:

Ich hoffe, folgende Componente kann den hier Leidgeplagten helfen:
|aisys.Windows.Verhalten| zentralisierte, einheitliches Steuerelement-Verhalten

Gruß
Juy Juka

Z
457 Beiträge seit 2007
vor 15 Jahren

Vielen Dank für deine Antwort.

Allerdings habe ich gerade mal in den Sourcecode reingeschaut und das mit dem SendKeys.Send("{TAB}") habe ich auch probiert. Dabei ist mir im Debugmodus der Rechner eingefroren da dort wohl darauf gewartet wird, dass SendKeys fertig wird.

Also leider nicht das richtige für mich 😦.

mfg
Zebes

Z
457 Beiträge seit 2007
vor 15 Jahren

Da fäll mir gerade noch ein das SendKeys in VB6 unter Vista Probleme mit der Benutzersteuerungskontrolle macht. Ich weiß jetzt nicht ob das unter .Net auch der Fall ist.

Ich habe mich gerade mal an einer alternativen Lösund versucht und bin zu dem Folgenden Ergebnis gekommen:


public partial class Form1 : Form {
	public Form1() {
		InitializeComponent();
	}

	private void Form1_KeyPress(object sender, KeyPressEventArgs e) {
		if(e.KeyChar == (char)Keys.Enter) {
			SetNextControl(ActiveControl);
			e.Handled = true;
		}
	}

	private void SetNextControl(Control control) {
		if (control.HasChildren) {
			foreach(Control childcontrol in control.Controls) {
				SetNextControl(childcontrol);
			}
		}
		else {
			if(control.Focused) {
				SelectNextControl(control, true, true, true, true);
			}
		}
	}
}

Das funktioniert auch soweit ganz gut. Nur doof ist, dass das KeyPressedEvent nicht von Buttons weitergereicht wird.

Z
457 Beiträge seit 2007
vor 15 Jahren

Ich konnte das Problem mit dem Button lösen.

Ein Button Löst das KeyUp Event aus, also verwende ich das. Um den nervigen Beep-Sound zu verhindern muss ich allerdings immer noch das KeyPressed handlen.

Der Code der Jetzt noch da steht hat auch noch einen Fehler. Und Zwar muss die Rekursion verlassen werden, sobald einmal SetNextControl aufgerufen wurde. Ansonsten kann es passieren, dass bei aufeinanderfolgende Controls im nächsten Schleifendurchlauf der Focus direkt weitergerreicht wird.

mfg
Zebes

Z
457 Beiträge seit 2007
vor 15 Jahren

Ok leider ist mir gerade noch eni Problem aufgefallen.

Bei einem FocusLost werden bei mir Suchdialoge angezeigt. Wenn ich in denen zur Auswahl Enter drücke wird das leider auch an meine Mainform weiter gereicht. Hat jemand eine Idee wie ich das abfangen kann? Sender bleibt leider die MainForm.

699 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

ich hatte gerade ein Dejavue erlebnis beim lesen des Threads 😉

Die Methode die Ihr sucht, um mit der Enter Taste das nächste Control in der Tab-Reihenfolge anzuspringen ist folgender:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) {   if(e.KeyChar.Equals('\r')) {     this.ProcessTabKey(true);     e.Handled=true;   } }

Zu finden ist das ganze im Openbook Visual C'

Grüße Stephan

56 Beiträge seit 2009
vor 14 Jahren

Hallo,

das Thema ist zwar schon etwas älter, da ich aber ein ähnliches Problem habe und keinen Neues aufmachen wollte, hänge ich mich mal hier ran.

Mittels:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) {
	Char userKey	= e.KeyChar;
	if(userKey == (char)Keys.Enter) {
		// SelectNextControl(this.ActiveControl, true, true, true, true);
		this.ProcessTabKey(true);
		e.Handled = true;
	}
}

kann man die Enter-Taste zum Navigieren durch mehrere Textboxen benutzen. Das funktioniert auch ohne Weiteres. Da ich sehr viele Textboxen benötige, die alle mit einem Label versehen sein müssen, hab ich mir ein benutzerdefiniertes Steuerelement gebastelt, das aus einer Textbox und einem Label besteht. Leider funktioniert der oben angegebene Codeschnipsel dann nicht mehr. Außer einem lästigen ping-geräusch passiert gar nichts. Was mache ich hier falsch?

Danke und Gruß

Mit freundlichen Grüßen Humsch

5.299 Beiträge seit 2008
vor 14 Jahren

vermutlich mussteden Code iwie in dein UserControl verlegen

Der frühe Apfel fängt den Wurm.

56 Beiträge seit 2009
vor 14 Jahren

vermutlich mussteden Code iwie in dein UserControl verlegen

Das hab ich bereits getan.

private void LabelTextBox_KeyPress(object sender, KeyPressEventArgs e) {
	Char userKey	= e.KeyChar;
	if(userKey == (char)Keys.Enter) {
		// SelectNextControl(this.ActiveControl, true, true, true, true);
		this.ProcessTabKey(true);
		e.Handled = true;
	}
}

Hilft aber nichts. X(

Mit freundlichen Grüßen Humsch

5.299 Beiträge seit 2008
vor 14 Jahren

wirdn


        this.ProcessTabKey(true);

ühaupt aufgerufen?

Der frühe Apfel fängt den Wurm.

56 Beiträge seit 2009
vor 14 Jahren

wirdn

  
        this.ProcessTabKey(true);  

ühaupt aufgerufen?

Gute Frage. Nee, wird nicht aufgerufen. Für das bdStE wird anscheinend gar kein Tastaturereignis aufgerufen. 8o

Mit freundlichen Grüßen Humsch

5.299 Beiträge seit 2008
vor 14 Jahren

jibbets da auch son KeyPreview wie bei Forms?
Oder ist das Event gar nicht registriert?

Der frühe Apfel fängt den Wurm.

56 Beiträge seit 2009
vor 14 Jahren

jibbets da auch son KeyPreview wie bei Forms?
Oder ist das Event gar nicht registriert?

Nein, ein KeyPreview wie bei Forms gibt es nicht.
Das Ereignis ist registriert:

this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.LabelTextBox_KeyPress);

Mit freundlichen Grüßen Humsch

5.299 Beiträge seit 2008
vor 14 Jahren

dann musstewohl alle KeyPresses aller Textboxen auf deinen Handler leiten.

Der frühe Apfel fängt den Wurm.

148 Beiträge seit 2006
vor 14 Jahren

Hallöchen 😃

falls dein Control LabelTextBox heisst, dann musst du nicht auf das KeyPress der LabelTextBox reagieren, sondern auf das KeyPress der TextBox der LabelTextBox.
Kannst ja die TextBox des Controls als Property ausgeben und dann weist du das Event eben LabelTextBox.TextBox zu. Dann sollte das eigentlich auch funktionieren 😃

greetz..

I cna tpye 300 wrods pre mnuite!

56 Beiträge seit 2009
vor 14 Jahren

...falls dein Control LabelTextBox heisst, dann musst du nicht auf das KeyPress der LabelTextBox reagieren, sondern auf das KeyPress der TextBox der LabelTextBox.. Das hatte ich ja urspünglich so versucht. Funktionierte aber nicht, weshalb ich ja dann auf das KeyPress der LabelTextBox ausgewichen bin. Was allerdings genau so wenig zum Erfog führte.

Kannst ja die TextBox des Controls als Property ausgeben und dann weist du das Event eben LabelTextBox.TextBox zu. Dann sollte das eigentlich auch funktionieren ?( ?( ?(

Mit freundlichen Grüßen Humsch

148 Beiträge seit 2006
vor 14 Jahren

Hallöchen,

also ich meinte das wie folgt (kleiner BeispielCode, keine große HintergrundLogik):

Die Klasse LabelTextBox (dein Benutzersteuerelement) hat eine TextBox, die heisst hier itsTextBox. Die gibst du per Property nach außen frei.


public partial class LabelTextBox : UserControl
   {
      public LabelTextBox()
      {
         InitializeComponent();
      }

      public TextBox TextBox
      {
         get { return itsTextBox; }
      }
   }

und in deiner Form, in der du diese TextBoxen nutzt, weist du eben diesen TextBoxen das Event zu (in meinem Beispiel ist es einfach eine Form, die vier LabelTextBoxen hat, mehr nicht):


public Form1()
      {
         InitializeComponent();

         foreach (LabelTextBox aLabelTextBox in this.Controls)
            aLabelTextBox.TextBox.KeyPress += new KeyPressEventHandler(TextBox_KeyPress);
      }

      void TextBox_KeyPress(object sender, KeyPressEventArgs e)
      {
         Char userKey    = e.KeyChar;
         if (userKey == (char)Keys.Enter)
         {
            // SelectNextControl(this.ActiveControl, true, true, true, true);
            this.ProcessTabKey(true);
            e.Handled = true;
         }
      }

wenn ich jetzt das ganze starte, in die erste LabelTextBox was eintrage und Return drücke, hüpft er zur nächsten usw, so wie eben erwartet. 🤔

greetz 🙂

I cna tpye 300 wrods pre mnuite!

Z
457 Beiträge seit 2007
vor 14 Jahren

Also ich habe es erstmal so gemacht, das ich rekursiv nach dem aktieven Controll suche und dann SetNextControll aufrufe. Das Funktioniert rellatiev gut. Das ping kannst du eignltich nur unterdrücken indem du einen der Keyhandler auf handled setzt glaube es war KeyPressed. Wenn jemand ne andere Methode kenn bitte posten.

56 Beiträge seit 2009
vor 14 Jahren

wenn ich jetzt das ganze starte, in die erste LabelTextBox was eintrage und Return drücke, hüpft er zur nächsten usw, so wie eben erwartet. 👶

Hallo,

vielen Dank für Deine Unterstütung, auch an die anderen, die mir hier geantwortet haben.

Die Lösung ist ganz einfach:


if(e.KeyChar	== (char)Keys.Enter) {
	SendKeys.Send("\t");
	e.Handled = true;
}

Hab ich hier im Forum gefunden. Wie man sieht, lohnt das Stöbern in alten Beiträgen.

Mit freundlichen Grüßen Humsch