Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Enter/Eingabe statt Tab Taste...
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

Themenstarter:

Enter/Eingabe statt Tab Taste...

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Denny
myCSharp.de - Member



Dabei seit:
Beiträge: 283
Herkunft: Koblenz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
swordfish
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für eure Antworten. Ich glaube ich werde einfach den User dazu trimmen die TAB Taste zu benutzen :-)
private Nachricht | Beiträge des Benutzers
swordfish
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

beantworten | zitieren | melden

tja ist wohl die einfachste lösung
wer fehler findet, darf sie behalten
private Nachricht | Beiträge des Benutzers
Nihat
myCSharp.de - Member



Dabei seit:
Beiträge: 47
Herkunft: Essen / Mönchengladbach

beantworten | zitieren | melden

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);
}
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

deinButton.PerformClick();
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

hej

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

greetz
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo torkel,

du musst natürlich noch einen entsprechenden EventHandler schreiben:


protected void Form2_Closed (Object objSender, EventArgs ea)
{
   // hier den Focus umsetzen
}
herbivore
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 508
Herkunft: Swiss

beantworten | zitieren | melden

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

hat geklappt.. super
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 459
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2282
Herkunft: Deutschland

beantworten | zitieren | melden

Hallo @All:

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

Gruß
Juy Juka
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 459
Herkunft: NRW

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Zebes am .
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 459
Herkunft: NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 459
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Zebes
myCSharp.de - Member



Dabei seit:
Beiträge: 459
Herkunft: NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Stipo
myCSharp.de - Member

Avatar #avatar-2966.gif


Dabei seit:
Beiträge: 704
Herkunft: Lörrach

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Stipo am .
private Nachricht | Beiträge des Benutzers
Humsch
myCSharp.de - Member

Avatar #avatar-2990.jpg


Dabei seit:
Beiträge: 56

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers