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

好吧,有两种主要方法。

  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 替换每个 TextBox 实例。

选项二仍然涉及重构,但它是每个表单选项一次。创建一个辅助类,如下所示;

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...

虽然我不确定你为什么需要写这个 - 据我所知,这种行为是 Winforms TextBox 的标准行为。

于 2013-02-14T20:52:44.550 回答