C # Запуск формы Windows нажатием клавиши

#c# #winforms #windows-forms-designer

#c# #winforms #windows-forms-designer

Вопрос:

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

Я пробовал несколько методов, но событие нажатия клавиши для формы просто не хочет срабатывать

Мой код:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CLT
{
    public partial class UnallocatedReceipts : UserControl
    {
        #region Windows Forms Designer


        private void InitializeComponent()
        {
        }

        #endregion

        //Constructor that Initializes the Form
        public UnallocatedReceipts()
        {
            InitializeComponent();
        }

        BLLService ws = new BLLService();

        //Set the properties and Datasets used in the form
        DataSet banks = new DataSet();

        public String ClientName { get; set; }
        public Int32 CompanyCode { get; set; }
        public Int32 UserLevel { get; set; }
        public Int32 BranchCode { get; set; }
        public Int32 UserCode { get; set; }


        private void UnallocatedReceipts_Load(object sender, EventArgs e)
        {
            txtClientNumber.Focus();
        }


        //Populates the Client Info Grid
        private void PopulateGrid(Int32 clientNumber)
        {
            datPortfolio.DataSource = ws.PortfolioSearch(clientNumber.ToString(), CompanyCode, UserLevel, BranchCode).Tables[0];
        }

        //Gets the Client information and sets the Client Name Label to the selected client
        private void GetClientInfo()
        {
            DataRow dr = ws.GetClient(txtClientNumber.Text, 0, 9).Tables[0].Rows[0];
            lblClientName.Text = dr["g"].ToString()   " "   dr["f"].ToString();
            lblClientName.Visible = true;
            lblCltName.Visible = true;
        }

        /*Method that runs when the search button is clicked, method calls Validate Client Number that checks 
        if the Client Number that was entered is a valid number*/
        private void btnSearch_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;

            datPortfolio.DataSource = null;

            if (ValidClientNumber())
            {
                Cursor.Current = Cursors.WaitCursor;

                GetClientInfo();
                PopulateGrid(Convert.ToInt32(txtClientNumber.Text));
                //ClientExisting nc = new ClientExisting(ClientName, LoadClient, EnterFromBusiness);
                datPortfolio.Focus(); 
            }            
        }


        //Retrieves the Bank Name and Bank Code
        private void GetBanks()
        {
            banks = ws.QBankGroupsForBD();

            DataView dvBank = new DataView(banks.Tables[0]);
            cboBankAccount.DataSource = dvBank;
            cboBankAccount.ValueMember = banks.Tables[0].Columns[0].ColumnName;
            cboBankAccount.DisplayMember = banks.Tables[0].Columns[1].ColumnName;
            cboBankAccount.Enabled = true;
        }

        //Method to clear the form when Cancel button is clicked and also when Receipt has been inserted
        private void ClearForm()
        {
            txtClientNumber.Text = "";
            lblClientName.Visible = false;
            lblCltName.Visible = false;
            lblCltName.Text = "";
            datPortfolio.DataSource = null;
            txtAccountNumber.Text = "";
            txtAccountNumber.ReadOnly = true;
            dtpActionDate.Enabled = false;
            dtpActionDate.Value = DateTime.Today;
            txtDescription.Text = "";
            txtDescription.ReadOnly = true;
            txtAmount.Text = "";
            txtAmount.ReadOnly = true;
            cboBankAccount.DataSource = null;
            cboBankAccount.Enabled = false;
            ActionDate = DateTime.Today;
        }


        //Method that validates the entries that was made in the form when the save button is clicked
        private bool ValidateEntries()
        {
            decimal value;
            bool isDecimal = decimal.TryParse(txtAmount.Text, out value);

            if (ActionDate > DateTime.Today)
            {
                MessageBox.Show("Action Date must be today or in the past");
                dtpActionDate.Focus();
                return false;
            }
            else if(txtDescription.Text == "")
            {
                MessageBox.Show("Please complete the Description");
                txtDescription.Focus();
                return false;
            }
            else if (isDecimal == false)
            {
                MessageBox.Show("Please enter a valid decimal");
                txtAmount.Focus();
                return false;
            }
            else
            {
                return true;
            }
        }

        //Method that calls the store proc to insert the Receipts in the Database
        private void InsertUnAllocatedReceipts()
        {

            try
            {
                ws.InsertUnAllocatedReceipts(
                    int.Parse(txtClientNumber.Text),
                    int.Parse(txtAccountNumber.Text),
                    ActionDate,
                    txtDescription.Text,
                    decimal.Parse(txtAmount.Text),
                    Convert.ToInt32(UserCode),
                    int.Parse(cboBankAccount.SelectedValue.ToString())
                    );
            }
            catch (Exception ex)
            {
                 MessageBox.Show("Please contact your System Administrator!nnDetailed error follows: "   ex.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void datPortfolio_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter) //If enter is pressed
            {
                LoadReceiptInformation();
            }
        }

        //Loads the Receipt information that needs to be completed in order to save the receipt
        private void LoadReceiptInformation()
        {
            txtAccountNumber.Text = datPortfolio[datPortfolio.CurrentRowIndex, 2].ToString();
            dtpActionDate.Enabled = true;
            txtAmount.Enabled = true;
            txtDescription.Enabled = true;
            GetBanks();
            dtpActionDate.Focus();
        }

        private void datPortfolio_DoubleClick(object sender, EventArgs e)
        {
            LoadReceiptInformation();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            ClearForm();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (ValidateEntries())
            {
                InsertUnAllocatedReceipts();
                MessageBox.Show("Your Unallocated Receipt has been Inserted");
                ClearForm();
            }
        }

        //Fires the Search client click event that loads the datagrid when enter is pressed
        private void txtClientNumber_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnSearch.PerformClick();
                e.Handled = true;
            }
        }



        private void cboBankAccount_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                btnSave.PerformClick();
                e.Handled = true;
            }
        }


    }
}
 

Я был бы признателен, если кто-нибудь сможет мне помочь

Ответ №1:

Переопределить ProcessCmdKey для обработки ключевых событий в пользовательском элементе управления:

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // 0x100 is WM_KEYDOWN
    if (msg.Msg == 0x100 amp;amp; keyData == Keys.Escape)
    {
        //
        // call your cancel method here
        //

        // return true if you have handled the key press
        return true;
    }

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

Ответ №2:

 this.CancelButton = btnCancel;
 

где btnCancel — это ваша кнопка отмены.

Комментарии:

1. Это пользовательский элемент управления, и, похоже, нет свойства кнопки отмены

Ответ №3:

Установите Form.KeyPreview=true и обработайте KeyDown событие или set CancelButton=ButtonID .

Комментарии:

1. Спасибо за ответ, это пользовательский элемент управления, и я не могу установить свойство KeyPreview, если я чего-то не упустил

Ответ №4:

 private void MyForm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if((Keys) e.KeyValue == Keys.Escape) 
        //this.Close(); or whatever your cancel action
}
 

и установите KeyPreview значение true

Комментарии:

1. По какой-то причине это событие не запускается

2. Вы установили для KeyPreview значение true в форме?

3. Я попытался установить его, но либо я делаю это не в том месте, либо что-то в этом роде, потому что я получаю сообщение об ошибке, а идентификатор KeyPreview не распознан

4. Это свойство формы .. попробуйте это. KeyPreview = true;

Ответ №5:

Событие нажатия клавиши не срабатывает, если вы нажимаете некоторые системные клавиши. Вместо этого используйте KeyDown:

 private void myControl_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            btnSave.PerformClick();
            e.Handled = true;
        }
    }
 

Комментарии:

1. По какой-то причине это событие не запускается

2. Я думаю, что допустил ошибку. Вы должны обрабатывать событие нажатия клавиши вашего элемента управления, а не cboBankAccount.

3. частная пустота нераспределенный receipts_keydown(отправитель объекта, KeyEventArgs e) { if (например, keyCode == Keys.Escape) { btnCancel. Выполнить щелчок (); т.е.Обработано = true; } }