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