web-dev-qa-db-de.com

Wie kann ich Strg + a mit TextBox in Winform zulassen?

Ich stelle hier die bereits gestellte (und sogar beantwortete) Frage: Warum akzeptieren einige Textfelder nicht die Tastenkombination Strg + A, um standardmäßig alle auszuwählen

Aber diese Antwort funktioniert bei mir nicht. Ich habe diesen Code:

public class LoginForm : Form
{
    private TextBox tbUsername;

    public LoginForm()
    {
        tbUsername = new TextBox();
        tbUsername.ShortcutsEnabled = true;
        tbUsername.Multiline = false;
        Controls.Add(tbUsername);
    }
}

Das Textfeld wird angezeigt, ich kann darauf schreiben, ich kann problemlos Text ausschneiden, kopieren und einfügen. Aber wenn ich versuche zu drücken Ctrl+A Ich höre nur ein "Klingeln" ähnlich dem Klingeln, das Sie hören, wenn Sie versuchen, Text aus einem leeren Textfeld zu löschen (versuchen Sie es mit der Adressleiste Ihres Browsers).

55

Wie andere Antworten andeuten, sollte Application.EnableVisualStyles() aufgerufen werden. Auch der TextBox.ShortcutsEnabled sollte auf true gesetzt werden. Aber wenn dein TextBox.Multiline aktiviert ist dann  Ctrl+A  funktioniert nicht ( siehe MSDN-Dokumentation ). Die Verwendung von RichTextBox umgeht das Problem.

70
jltrem

Erstellen Sie einfach ein Keydown-Ereignis für das betreffende Textfeld und geben Sie diesen Code ein:

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        if (sender != null)
            ((TextBox)sender).SelectAll();
    }
}
32
Stack Man

Sie können die Prozessbefehlstasten immer überschreiben, um das gewünschte Ergebnis zu erhalten

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    const int WM_KEYDOWN = 0x100;
    var keyCode = (Keys) (msg.WParam.ToInt32() &
                          Convert.ToInt32(Keys.KeyCode));
    if ((msg.Msg == WM_KEYDOWN && keyCode == Keys.A) 
        && (ModifierKeys == Keys.Control) 
        && tbUsername.Focused)
    {
        tbUsername.SelectAll();
        return true;
    }            
    return base.ProcessCmdKey(ref msg, keyData);
}
24
Charles380

Die Antwort ist schnell, wenn Sie Multiline True verwenden, müssen Sie select all explizit aufrufen.

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        tbUsername.SelectAll();
    }
}
4
Nick Roberts

Das ist mir auch einmal passiert, ich gehe davon aus, dass Sie den Aufruf für Application.EnableVisualStyles(); aus Ihrem Programm entfernt haben. Fügen Sie es wieder zur Funktion Main() hinzu und alles sollte gut funktionieren.

3
user2032433

Textbox hat eine Methode SelectAll() und hat für mich gut funktioniert. (. net 4,5)

1
Amit

In meine zwei Cents werfen. Das Aufrufen unter Tastendruck ist nur eine weitere Option.

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\x1')
    {
        TxtBox.SelectAll();
        e.Handled = true;
    }
}
0
Barry Guvenkaya

Keine Notwendigkeit, mit WM_KEYDOWN umzugehen! Ich weiß, dass die meisten Beispiele hier (und CodeProject und viele andere Orte) sagen, dass es gibt, aber es heilt nicht den Piepton, der auftritt, wenn ein WM_CHAR auftritt, der nicht behandelt wird.

Versuchen Sie stattdessen Folgendes:

LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
  if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;}
  else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam);
}

Denken Sie daran, das EDIT-Steuerelement diesem Edit_Prc () mit WPA = SetWindowLong (...) zu unterordnen, wobei WPA die Fensterprozeduradresse für CallWindowProc (...) ist.

Ich fand das experimentell heraus, nachdem ich herausgefunden hatte, dass alle Antworten, die ich online gefunden hatte, darauf bestanden, mit WM_KEYDOWN und GetKeyState () umzugehen, und am Ende mit einem größeren Code endete, der diesen lästigen Piepton nicht aufhielt!

Während sich diese Antwort nicht mit Dotnet befasst, ist es in solchen Fällen in der Regel besser, sich auf die Jagd zu konzentrieren und sie zu lösen, anstatt sich darüber zu quälen, welche Version eines großen Code-Wrapper-Systems dies für Sie tun kann oder nicht, vor allem, wenn Sie möchten um das Risiko des Kampfes gegen eingebaute Verhaltensweisen zu vermeiden.

0
user1418124