[英]MessageBox without a default button
我的应用程序中有一个表格,用户可以输入一个序列号列表,每个序列号都需要进行快速检查,然后添加到列表中(这是用于盘点模块的)。 因此,用户通常使用条形码扫描仪从一堆存货中扫描序列号。
我正在处理用户正在扫描项目并查找e.KeyChar == 13
(Enter键)时具有焦点的TextBox
的KeyPress
事件。 每当按下Enter键时,我就知道我拥有完整的序列号,然后可以对其进行验证,然后将其添加到列表中。
这是我的问题发生的地方; 在某些条件下,我必须在这一点上提示用户是否确实要将库存商品添加到列表中。 我为此使用了一个MessageBox
,如下所示:
if (MessageBox.Show("This is a special stock item.\r\nDo you want to add it to the list?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
// Add item to list
else
// Do not add item to list
但是因为这只是偶尔发生,所以用户通常甚至看不到MessageBox
而只是扫描下一个序列号,该序列号当然会丢失,但以回车键结尾,从而触发MessageBox
上的默认按钮,无需这样做,有时甚至不知道它发生了,用户将一个项目添加到列表中而错过了下一个项目。
有没有一种方法可以防止MessageBox
在按下Enter键时触发任何按钮? 我不介意用户是否继续扫描条形码并丢失所有条形码,只要MessageBox
一直显示在屏幕上,直到他意识到需要注意并故意选择两个选项之一即可。
有没有一种方法可以防止MessageBox在按下Enter键时触发任何按钮?
没有。
我不介意用户是否继续扫描条形码并丢失所有条形码,只要MessageBox一直显示在屏幕上,直到他意识到需要注意并故意选择两个选项之一即可。
使用YesNoCancel
选项,并将默认值设置为Button3
,这将是“ Cancel
按钮。 现在,在结果为Cancel
继续循环。 当循环退出时,用户将选择“是Yes
或“ No
:
DialogResult result;
do
{
result = MessageBox.Show("This is a special stock item.\r\nDo you want to add it to the list?", "Confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3);
} while (result == DialogResult.Cancel);
if (result == DialogResult.Yes)
{
// yes
}
else
{
// no
}
----------编辑----------
我不太喜欢在对话框上有一个按钮的想法,除了对于一些晦涩的应用程序逻辑(从用户的角度来看)外,其他什么都没有。
同意...拥有“小睡”按钮不是最佳选择。 上面的解决方案是一个快速而肮脏的“修复程序”。
当您开始实现自己的自定义MessageBox窗体时,以下是一种简单的方法,可以使每当Button当前处于焦点时忽略Enter键:
public partial class frmVerify : Form
{
public frmVerify()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter && this.ActiveControl is Button)
{
return true; // suppress the keystroke
}
return base.ProcessCmdKey(ref msg, keyData);
}
// ... more code ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.