簡體   English   中英

自定義DGV上的不可能任務將焦點設置為Enter鍵上的下一個控件

[英]Impossible Task On Custom DGV Set Focus To Next Control On Enter Key Press

這是我為您帶來的真正挑戰。 如果可以解決。

Datagridview上的Enter鍵是個好主意嗎? 還是這里的任何人都可以按照以下條件工作?

如果不是,那么在按Enter鍵時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();
        }
    }

在正常情況下,該控件工作正常,它可以將焦點放在輸入按鍵上的下一個控件上,但是如果在數據綁定模式下設置AllowUserToAddRows = false ,則該控件不起作用。 當您編輯最后一列的單元格值並按Enter鍵時,將出現確切的問題,不允許將焦點放在下一個控件上。

如何克服這個? 該如何解決呢?

通過在當前控件上添加焦點事件,我找到了一種對您有用的解決方案。 我認為這是您想要的,但無法真正理解您的問題。 讓我知道是否有所不同。 它適用於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
        }
    }

我看到的是僅查看代碼而不運行代碼的問題是:

用戶將轉到DataGridView中的最后一個控件,並且沒有要返回的GetNextControl控件。

您可能需要添加一些邏輯來處理這種情況。 例如,您可以將焦點設置為向導形式的“提交”或“下一步”按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM