2011-10-24 61 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