2011-10-24 63 views
0

我试图让取消按钮事件触发,只要用户按下表格上任何地方的Escape键。C#Windows窗体发射Keypess

我尝试了好几种方法,但窗体的按键事件只是想不火

我的代码是:

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


    } 
} 

我会是感激,如果有人可以帮助我

回答

0
this.CancelButton = btnCancel; 

其中btnCancel是您的取消按钮。

+0

这是一个用户控件,有似乎不是一个取消按钮属性 –

0
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

+0

此事件不由于某种原因失火 –

+0

您是否在表单中将KeyPreview设置为true? –

+0

我试图设置它,但无论是我在错误的地方或东西,因为我得到一个错误,并且KeyPreview ID不被识别 –

0

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

+0

HiThanks的答复这是一个用户控件,我不能设置KeyPreview属性,除非我缺少一些东西 –

0

如果您按某些系统键,KeyPress事件不会触发。使用的KeyDown代替:

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

这个事件不会因为某些原因而触发 –

+0

我想我'我犯了一个错误。您应该处理您的控件的KeyDown事件,而不是cboBankAccount。 – mao

+0

我试图处理它的形式,但它不火 –

1

覆盖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); 
} 
+0

非常感谢, –

+0

然后请标记为正确的答案 – Sandy