Как использовать функцию для каждой WinForm C # вместо вставки - PullRequest
2 голосов
/ 29 апреля 2010
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            {
                if (keyData == Keys.Escape) this.Close();
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }

Я обнаружил этот фрагмент, чтобы закрыть форму окна с помощью esc. Я действительно хочу реализовать это в каждой форме окна. Я пытаюсь создать новый абстрактный класс, который наследуется от формы, и другая форма окна будет наследовать от этого. Но так не получается.

abstract class AbsForm: Form {
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            {
                if (keyData == Keys.Escape) this.Close();
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }
    }
    public partial class HoaDonBanSach : AbsForm
    {
        public HoaDonBanSach()
        {
            InitializeComponent();
        }

Спасибо за чтение этого:)

Ответы [ 4 ]

3 голосов
/ 29 апреля 2010

Попробуйте вместо этого:

class CustomForm : Form 
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Escape)
        {
            this.Close();
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

class InheritedForm : CustomForm
{
    // this form now has the functionality from CustomForm
}
2 голосов
/ 29 апреля 2010

Я бы предложил не делать этого в форме, а вместо этого реализовать IMessageFilter и добавить его с помощью Application.AddMessageFilter. Примерно так:

public class CloseWindowBehavior : IMessageFilter {

    const int WM_KEYDOWN = 0x100;
    const int VK_ESCAPE = 0x1B;

    bool IMessageFilter.PreFilterMessage(ref Message m) {
        if (m.Msg == WM_KEYDOWN && (int)m.WParam == VK_ESCAPE) {
            if (Form.ActiveForm != null) {
                Form.ActiveForm.Close();
            }
            return true;
        }
        return false;
    }

}

Application.AddMessageFilter(new CloseWindowBehavior());
0 голосов
/ 29 апреля 2010

В общем смысле, когда вы хотите применить одно и то же действие к всем формам, вы можете использовать IMessageFilter, как предложено @Josh Einstein.

Если вы хотите совместно использовать один обработчик событий для нескольких элементов управления / форм (но не для всех), тогда другой подход заключается в том, чтобы заставить их всех использовать один и тот же метод обработчика событий.

Например, в конструкторе форм добавьте в форму две кнопки (button1, button2). Теперь перейдите в поле обработчика события OnClick в свойствах для button1 и дважды щелкните. Это создаст для вас метод обработчика события button1_Click. Теперь перейдите к кнопке 2 и в поле обработчика события Click в окне свойств введите имя button1_Click, и кнопка 2 теперь будет делиться тем же обработчиком событий для своих кликов.

Вы можете сделать то же самое в коде. Откройте созданный дизайнером код и найдите определение кнопки2. Вы увидите, что теперь у него есть привязка к событию Click для метода-обработчика события:

this.button2.Click += new System.EventHandler(this.button1_Click);

Вы можете добавить привязки как код для любого события таким же образом, чтобы вы могли связать несколько форм, например, с одним и тем же обработчиком события.

0 голосов
/ 29 апреля 2010

Если вы хотите использовать конструктор, вы не можете пометить свой базовый класс как абстрактный.

Дизайнер создаст экземпляр базового класса формы, которую вы разрабатываете, что невозможно сделать с абстрактными классами.

Кроме того, я не думаю, что HoaDonBanSach не наследует вашу реализацию ProcessCmdKey. За исключением того, что вы перезаписали его в другом файле (HoaDonBanSach, в конце концов, является частичным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...