Autor Beitrag
tomycat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.06.17 10:19 
hallo,
ich habe eine Textbox A eine Textbox B und einen Button xy.

Ist der Cursor in der Textbox A und ich klicke auf den Button xy soll die Messages kommt "A". Bei Textbox B soll "B" kommen.

Wie sieht der Inhalt von dem Button xy aus?


Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Mo 05.06.2017 um 10:23
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.06.17 11:07 
Hallo,

dafür gibt es die Eigenschaft ActiveControl...

Für diesen Beitrag haben gedankt: tomycat
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.06.17 11:27 
Zitat:
dafür gibt es die Eigenschaft ActiveControl...

Wenn man nichts besonderes anstellt wird im Click Handler eines Buttons der Button das ActiveControl sein.

Zitat:
Ist der Cursor in der Textbox A und ich klicke auf den Button xy soll die Messages kommt "A".


Im Standardfall beschreibst du einen ungültigen Zustand. Sobald du den Button klickst hat der den Focus womit niemand anderes den Focus hat und damit auch niemand der einen Cursor haben könnte noch einen hat. Was du machen kannst ist dir zu merken welches Control(oder nur TextBox) zuletzt den Focus hatte. Dazu kannst du z.B. den Leave Event eines Control verwenden und dir in diesem das Control merken das da gerade verlassen wurde. Das gemerkte Control kannst du dir dann im Button Klick Event ansehen und das passende damit anstellen.

Für diesen Beitrag haben gedankt: tomycat
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.06.17 12:06 
Mir ist das klar ;-)

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.06.17 15:23 
Das mit dem merken von "Wo war zuletzt der Cursor" ist ein guter Ansatz. Aber ich in meinem Projekt viele Textboxen und Viele Buttons.
Ok, andere Idee:

Button xy Soll den Tastenanschlag 1 simulieren. Sprich Cursor ist in Textbox A, ich klicke auf Button xy.Dann soll eine 1 in der Textbox a drin stehen.
Geht das einfacher?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 05.06.17 15:48 
Hey,

es ist kein Problem wenn du viele TextBoxen hast. Du musst ja nicht jede einzelne manuell prüfen:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
using System;
using System.Linq;
using System.Windows.Forms;

namespace WinForms
{
    public partial class Form1 : Form
    {
        // Hier wird die zuletzt verwendete TextBox gespeichert
        private TextBox lastFocusedTextBox;

        public Form1()
        {
            InitializeComponent();
            
            // Durchlaufe einmal die UI Struktur
            SubscribeToFocusChange(Controls);
        }

        // Diese Methode durchläuft deine komplette UI Struktur rekursiv und fügt für jede 
        // TextBox einen EventHandler für das GotFocus-Event hinzu.
        private void SubscribeToFocusChange(Control.ControlCollection controls)
        {
            foreach (var control in controls.OfType<Control>())
            {
                if (control is TextBox)
                    ((TextBox) control).GotFocus += OnTextBoxFocused;
                else
                    SubscribeToFocusChange(control.Controls);
            }
        }

        // Sobald eine TextBox den Fokus bekommt, wird sie als zuletzt fokussierte TextBox
        // gespeichert (lastFocusedTextBox)
        private void OnTextBoxFocused(object sender, EventArgs e)
        {
            lastFocusedTextBox = sender as TextBox;
        }

        // Dummy Funktion für einen Klick auf eien Button
        private void button1_Click(object sender, EventArgs e)
        {
            lastFocusedTextBox.AppendText("1");
        }
    }
}


Ich denke die Kommentare im Code sollten eindeutig sein. Dieses Snippet (genauer die Methode SubscribeToFocusChange) sucht in deiner kompletten Form nach allen TextBoxen und fügt denen dann einen EventHandler für das GotFocus-Event hinzu. Sobald dann eine TextBox den Fokus erhält, wird diese in der VariablelastFocusedTextBox gespeichert.

//Nachtrag
Das ist genau das, was Ralf gemeint hat (mit Ausnahme des Leave bzw. LostFocus Events)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.06.17 19:16 
thx all,
hab die LÖsung:

ausblenden C#-Quelltext
1:
 SendKeys.Send("1");					
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.06.17 19:45 
Das ist eher eine Lösung für ein anderes Problem ;)
Wenn du SendKeys im Click Event eines Buttons benutzt sendest du das Zeichen an den Button da der Button den Focus haben wird. Also sollte sich die Beschriftung des Buttons ändern.
Wenn es doch funktioniert dann hast du irgendein wichtiges Detail verschwiegen.

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Di 06.06.17 18:59 
... Naja es ist ein Bild, wenn ich drauf Klicke wird eine Funktion ausgeführt. Zur einfacherung habe ich Button geschreiben, ich denke mal es läuft auf gleiche hinaus. Der Send Befehl geht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 06.06.17 20:06 
Das hat hier ja auch einen gewissen dokumentarischen Zweck. Jemand der das hier auf der Suche nach Hilfe findet könnte glauben es geht was es mit einem Button nicht tut.
Wenn du eine PictureBox meinst auf die du klickst dann ja das geht weil eine PictureBox eben keinen eigenen Focus hat (heißt nebenbei auch das deine UI nicht tastaturbedienbar ist wenn du das nicht explizit selber ausprogrammierst)

Zitat:
Zur einfacherung habe ich Button geschreiben, ich denke mal es läuft auf gleiche hinaus

Nun ja deine ~Vereinfachung~ hat dazu geführt das alle versucht haben ein Problem zu lösen (wie geht man mit dem Foxuswechsel um) das du gar nicht hattest ;)
Ist also eher nicht das gleiche.

Für diesen Beitrag haben gedankt: Christian S., erfahrener Neuling