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;
    }
}
4

3 に答える 3

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;
        }
    }


}
于 2013-02-14T20:57:30.020 に答える
2

さて、これには主に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);
    }
}

これには、TextBox のすべてのインスタンスを ShortcutTextBox に置き換える必要があるという警告が伴います。

オプション 2 にはリファクタリングが含まれますが、フォームごとに 1 回のオプションです。次のようなヘルパー クラスを作成します。

public abstract class ControlUtilities
{
    public static void AddTextBoxShortcuts(Control.ControlCollection controls)
    {
        foreach (Control c in controls)
        {
            if (c is TextBox)
            {
                TextBox txt = (TextBox)c;
                txt.KeyDown += textBox_KeyDown;
            }
            else if (c.Controls != null && c.Controls.Count > 0)
            {
                // recursively look for text boxes
                AddTextBoxShortcuts(c.Controls);
            }
        }
    }

    private static void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        if (e.Control && e.KeyCode == Keys.A)
        {
            txt.SelectAll();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.C)
        {
            txt.Copy();
            e.SuppressKeyPress = true;
        }
        else if (e.Control && e.KeyCode == Keys.V)
        {
            txt.Text = Clipboard.GetText();
            e.SuppressKeyPress = true;
        }
    }
}

フォームの Load イベントで次のように呼び出します。

private void Form1_Load(object sender, EventArgs e)
{
    ControlUtilities.AddTextBoxShortcuts(this.Controls);
}
于 2013-02-14T21:07:56.793 に答える
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...

なぜこれを書く必要があるのか​​はわかりませんが、私が知る限り、この動作はWinformsTextBoxの標準です。

于 2013-02-14T20:52:44.550 に答える