2013-02-14 44 views
2

在.NET應用程序(使用WinForms)的最初開發過程中,我不得不進入並創建常見的編輯快捷方式,如CTRL-A,CTRL-C和CTRL-V,因爲它們沒有啓用默認情況下。現在我的應用程序已經發展到了不少文本框,我正試圖弄清楚如何重構下面的代碼。有人可以幫忙嗎?如何重構這些快捷鍵

private void textBox1_results_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.A) 
    { 
     textBox1_results.SelectAll(); 
     e.SuppressKeyPress = true; 
    } 

    if (e.Control && e.KeyCode == Keys.C) 
    { 
     textBox1_results.Copy(); 
     e.SuppressKeyPress = true; 
    } 

    if (e.Control && e.KeyCode == Keys.V) 
    { 
     textBox1_results.Text = Clipboard.GetText(); 
     e.SuppressKeyPress = true; 
    } 
} 
+1

他們還需要嗎? – flup 2013-02-14 20:45:00

+0

你是什麼意思?我剛剛發佈了這個問題。 – Jeagr 2013-02-14 20:48:48

+1

也許你創建了TextBox的子類,添加並連接了KeyDown處理程序,並使用這個子類而不是TextBox。 – 2013-02-14 20:49:00

回答

1

大概是這樣的:

private static void Shortcut_KeyDown(object sender, KeyEventArgs e) 
{ 
    var textBox = (TextBox)sender; 

    if (e.Control && e.KeyCode == Keys.A) 
    { 
     textBox.SelectAll(); 
     e.SuppressKeyPress = true; 
    } 

    if (e.Control && e.KeyCode == Keys.C) 
    { 
     textBox.Copy(); 
     e.SuppressKeyPress = true; 
    } 

    if (e.Control && e.KeyCode == Keys.V) 
    { 
     textBox.Text = Clipboard.GetText(); 
     e.SuppressKeyPress = true; 
    } 
} 

,並將其應用:

textBox1.KeyDown += Shortcut_KeyDown; 
textBox2.KeyDown += Shortcut_KeyDown; 
// etc... 

雖然我不知道你爲什麼會需要在所有寫這篇文章 - 這種行爲是標準據我所知Winforms TextBox。

+0

謝謝....完美的工作。是的,你會這樣想的。但是我所有的WinForms都只是盯着我,在我嘗試去做時什麼也不做。 – Jeagr 2013-02-14 21:04:34

2

如果你有一個BaseForm,你的所有表單都會繼承,試着將上面的代碼移動到它並從所有的文本框事件處理程序中調用它。

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

    private void Form2_Load(object sender, EventArgs e) 
    { 

    } 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     base.TextKeyDown(sender, e); 
    } 
} 


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

    public void TextKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Control && e.KeyCode == Keys.A) 
     { 
      ((TextBox) sender).SelectAll(); 
      e.SuppressKeyPress = true; 
     } 

     if (e.Control && e.KeyCode == Keys.C) 
     { 
      ((TextBox)sender).Copy(); 
      e.SuppressKeyPress = true; 
     } 

     if (e.Control && e.KeyCode == Keys.V) 
     { 
      ((TextBox)sender).Text = Clipboard.GetText(); 
      e.SuppressKeyPress = true; 
     } 
    } 


} 
2

那麼,這有兩個主要的方法。

  1. 由System.Windows.Forms.TextBox繼承並添加您自己的實現在KeyDown(仍在呼籲base.KeyDown()),與捷徑的創建自己的文本框控件啓用
  2. 創建一個幫手在每個表單的Load中調用的類,即使它遍歷表單上的所有控件,並向您的代碼添加處理程序。

選項1是類似的;

public class ShortcutTextBox : TextBox 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.Control && e.KeyCode == Keys.A) 
     { 
      SelectAll(); 
      e.SuppressKeyPress = true; 
     } 
     else if (e.Control && e.KeyCode == Keys.C) 
     { 
      Copy(); 
      e.SuppressKeyPress = true; 
     } 
     else if (e.Control && e.KeyCode == Keys.V) 
     { 
      Text = Clipboard.GetText(); 
      e.SuppressKeyPress = true; 
     } 

     base.OnKeyDown(e); 
    } 
} 

雖然這附帶了你需要與ShortcutTextBox替換文本框的每一個實例告誡。

選項二仍然涉及重構,但它是每個表單選項的一次。創建一個像下面這樣的幫助類:

​​

,並調用它在你的窗體的Load事件等;

private void Form1_Load(object sender, EventArgs e) 
{ 
    ControlUtilities.AddTextBoxShortcuts(this.Controls); 
}