KeyPress事件阻止DataGridView .net中的KeyUp事件

时间:2012-05-09 11:38:14

标签: .net winforms datagridview c#-3.0 keyboard-events

我想在DataGridView中将10个整个苹果分成10个人之间 DataGridView位于KeyPreview设置为true的表单中。人员的名称显示在设置为只读的DataGridViewTextBoxColumn( Column1 )中。然后将整数输入一个空的DataGridViewTextBoxColumn( Column2 )。 释放键时,计算/重新计算总和,如果column2的总和为30,则启用表单确定按钮(否则禁用)。

问题与keyEvents有关。如果绑定KeyPress事件,则不会触发KeyUp。

    // Bind events to DataGridViewCell
    private void m_DataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control != null)
        {
            e.Control.KeyUp -= m_DataGridView_KeyUp;
            e.Control.KeyPress -= m_DataGridView_KeyPress;
            e.Control.KeyUp += m_DataGridView_KeyUp;
            e.Control.KeyPress += m_DataGridView_KeyPress;
        }
    }

    //Only accept numbers
    private void m_GridView_KeyPress(object sender, KeyPressEventArgs e)
    {
        if ((e.KeyChar >= 48 && e.KeyChar <= 57) || e.KeyChar == 8)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

   // Sum the apples in column2
   private void m_DataGridView_KeyUp(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 1 && e.RowIndex > 0)
        {
            int count = 0;
            int parser = 0;

            foreach (DataGridViewRow item in this.m_DataGridView.Rows)
            {
                if (item.Cells[1].Value != null)
                {
                    int.TryParse(item.Cells[1].Value.ToString(), out parser);
                    count += parser;
                }
            }

            //make the ok button enabled
            m_buttonDividedApplen.Enabled = (count == 30);
        }
    }

这个故事问题变得陌生和陌生。如果我切换单元格,则会触发keyup事件。有时键盘会触发一次。

1 个答案:

答案 0 :(得分:0)

每次编辑控件触发时,你都会将处理程序重新附加到同一个事件,我相信这一点永远不会改变。

我认为如果您逐步完成代码,您会发现KeyPress事件会直接与您编辑单元格的次数成正比。首先尝试删除处理程序:

    e.Control.KeyUp -= m_DataGridView_KeyUp;
    e.Control.KeyPress -= m_DataGridView_KeyPress;

然后重新附上:

    e.Control.KeyUp += m_DataGridView_KeyUp;
    e.Control.KeyPress += m_DataGridView_KeyPress;

并查看KeyUp是否会触发。