C#Windows窗体启动键盘

本文关键字:键盘 启动 窗体 C#Windows | 更新日期: 2023-09-27 18:12:26

每当用户在表单上的任何位置按下Escape键时,我都试图激发Cancel按钮事件。

我已经尝试了几种方法,但表单的Keypress事件不想触发

我的代码是:

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!'n'nDetailed 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;
            }
        }

    }
}

如果有人能帮助我,我将不胜感激

覆盖ProcessCmdKey以处理用户控件中的关键事件:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // 0x100 is WM_KEYDOWN
    if (msg.Msg == 0x100 && 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);
}

C#Windows窗体启动键盘

this.CancelButton = btnCancel;

其中btnCancel是您的取消按钮。

设置Form.KeyPreview=true并处理KeyDown事件或设置CancelButton=ButtonID

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设置为真正的

KeyPress事件在按下某些系统键时不会触发。改为使用KeyDown:

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