【问题标题】:c# - KeyUp only on one formc# - KeyUp 仅在一种形式上
【发布时间】:2016-11-24 14:13:23
【问题描述】:

我有一个问题。 按 Enter 后,我打开新表单 (form2),我可以在其中向 db 添加一些内容。 在 Form2 上是按钮确定。如果我通过按 Enter 激活此按钮,我将关闭 form2。

问题是,通过这个动作,我又一次在 form1 上调用 KeyUp,并且我在循环中..

这是一个例子:

private void Form1_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
            this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent);
        }        
private void KeyEvent(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                dataGridViewSkladovePolozky.Focus();
                pridatDoKosiku();
            }
        }
private void buttonPridatDoKosiku_Click(object sender, EventArgs e)
        {
            pridatDoKosiku();
        }
private void pridatDoKosiku()
        {
            PridatDoKosiku pridatDoKosiku = new PridatDoKosiku(); 
            pridatDoKosiku.ShowDialog();
            refreshNakupniKosik(true);
            pridatDoKosiku.Dispose();
        }

【问题讨论】:

  • 这是由this.KeyPreview = true; 引起的。如果您想在打开 form2 时保持这种行为,那么在您的 KeyEvent 中添加 if(form2.Visible) return;
  • 没有特别的理由偏爱 KeyUp。您可能这样做是为了解决 KeyPreview 的尴尬行为。这是一个遗留的 VB6 属性并具有 VB6 语义,您不会获得导航键的 KeyDown 事件。喜欢输入。改写 ProcessCmdKey()。

标签: c# keypress keyup


【解决方案1】:

由于您已经在表单中标记了KeyPreview,它将捕获所有关键事件。 您可以像这样设置标志和管理。

bool InFocus = false;
    private void Form1_Load(object sender, EventArgs e)
            {
                this.KeyPreview = true;
                this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent);
            }        
    private void KeyEvent(object sender, KeyEventArgs e)
            {
           if(InFocus ) return;
                if (e.KeyCode == Keys.Enter)
                {
                    dataGridViewSkladovePolozky.Focus();
                    pridatDoKosiku();
                }
            }
    private void buttonPridatDoKosiku_Click(object sender, EventArgs e)
            {
                pridatDoKosiku();
            }
    private void pridatDoKosiku()
            {
                PridatDoKosiku pridatDoKosiku = new PridatDoKosiku(); 
InFocus = true;
                pridatDoKosiku.ShowDialog();
                refreshNakupniKosik(true);
                pridatDoKosiku.Dispose();
InFocus = false;
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2014-04-12
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多