自定义DGV上的不可能任务设置焦点到下一个控制输入按键

时间:2011-08-06 10:14:36

标签: c# datagridview visual-studio-2005

这是我为您带来的真正挑战。如果可以,请解决它。

在Datagridview上输入密钥这是好主意吗?或者这里的任何人都可以按照以下条件进行操作吗?

如果输入键不是Datagridview Control无效,请按

我有以下自定义DGV:

public class MyDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            Keys key = (keyData & Keys.KeyCode);
            if (key == Keys.Enter)
            {
                Tab(keyData);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
        protected override bool ProcessDataGridViewKey(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Tab(e.KeyData);
                return true;
            }
            return base.ProcessDataGridViewKey(e);
        }
        private void Tab(Keys KeyData)
        {
            Point cca = CurrentCellAddress;
            bool Forward = ((KeyData & Keys.Shift) != Keys.Shift);
            if (Forward)
                if (cca.Y == Rows.Count - 1)            // last row?
                    if (cca.X == Columns.Count - 1)     // last column?
                        ToNextControl(Forward);
                    else
                        ProcessTabKey(KeyData);
                else
                    ProcessTabKey(KeyData);
            else
                if (cca.Y == 0)         // first row?
                    if (cca.X == 0)     // first column?
                        ToNextControl(Forward);
                    else
                        ProcessTabKey(KeyData);
                else
                    ProcessTabKey(KeyData);
        }

        /// <summary>
        /// Go to the next control, forward or backword. This does not support
        /// wrapping from the first to the last or the last to the first.
        /// </summary>
        /// <param name="Forward">Whether to go forward</param>
        private void ToNextControl(bool Forward)
        {
            Control c = Parent.GetNextControl(this, Forward);
            while (c != null && !c.TabStop) // get next control that is a tabstop
                c = Parent.GetNextControl(c, Forward);
            if (c != null)
                c.Select();
        }
    }

同样正常工作正常它允许在enter keypress上关注下一个控件但如果你在数据绑定模式下设置 AllowUserToAddRows = false 则它不起作用。编辑最后一列的单元格值时会产生确切的问题,按Enter键不允许将焦点设置在下一个控件上。

如何克服这个?如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

通过在当前控件上添加焦点事件,我找到了一个适合您的解决方案。我想这就是你想要的,但却无法理解你的问题。如果它有所不同,请告诉我。它适用于AllowUserToAddRows = falsetrue

 private void ToNextControl(bool Forward)
    {
        Control c = Parent.GetNextControl(this, Forward);         
        while (c != null && !c.TabStop) // get next control that is a tabstop
            c = Parent.GetNextControl(c, Forward);
        if (c != null)
        {
            //c.Select(); // Not needed for it to work
            c.Focus(); // force it to focus
        }
    }

答案 1 :(得分:0)

我看到的问题只是查看代码而不运行它是:

用户到达DataGridView中的最后一个控件,并且无法控制GetNextControl返回。

你可能想要添加一些逻辑来处理这种情况。例如,如果是向导形式,则可以将焦点设置在提交或下一个按钮上。