防止C# Winforms中DataGridView中的ComboBox立即打开和关闭

smdnsysy  于 6个月前  发布在  C#
关注(0)|答案(1)|浏览(81)

我有一个C# WinForms应用程序,我成功地过滤了ComboBox项目,通过编写其项目的任何部分,并在输入文本部分后按Enter键,使用以下代码:

private void detailsGridView_EditingControlShowing(object sender,
            DataGridViewEditingControlShowingEventArgs e)
        {
            var comboBox = e.Control as ComboBox;
            if (comboBox != null)
            {
                comboBox.DropDownStyle = ComboBoxStyle.DropDown;
                comboBox.PreviewKeyDown += ComboBox_PreviewKeyDown;
            }
        }

        private void ComboBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if ((e.KeyCode & e.KeyData) == Keys.Return)
            {
                if (((ComboBox)sender).SelectedItem == null)
                {
                    e.IsInputKey = true;
                    ((ComboBox)sender).DataSource = accounts
                        .Where(a => a.Name.Contains(((ComboBox)sender).Text))
                        .ToList();
                    ((ComboBox)sender).DroppedDown = true;
                }
            }
        }

然后我在**((ComboBox)sender).DroppedDown = true**行遇到了一个问题,列表被立即删除并关闭。
在调试时我注意到KeyDown事件引发了两次,所以我尝试了一个flag变量来检查第二次引发并取消,但没有用。我尝试了很多其他方法,比如:

  • 新增一行comboBox.PreviewKeyDown -= ComboBox_PreviewKeyDown;(带减号),在加号线之前。
  • 使用每个KeyDown和PreviewKeyDown事件侦听器。

但列表出现后,还是瞬间关闭。
在这方面,什么是正确的做法?

编辑:

我注意到,当我删除条件行**if((e.KeyCode & e.KeyData)== Keys.Return)**时,
该功能不能正常工作,但也列表保持开放。

fquxozlt

fquxozlt1#

我通过添加一个单独的方法来处理过滤器解决了这个问题,另一个方法用于处理KeyDown问题,这是代码:

private void detailsGridView_EditingControlShowing(object sender,
            DataGridViewEditingControlShowingEventArgs e)
        {
            
            if (e.Control is ComboBox comboBox)
            {
                comboBox.DropDownStyle = ComboBoxStyle.DropDown;

                comboBox.KeyDown += ComboBox_KeyDown;
                comboBox.PreviewKeyDown += ComboBox_PreviewKeyDown;
            }
        }

        private void ComboBox_PreviewKeyDown(object sender, 
            PreviewKeyDownEventArgs e)
        {
            if ((e.KeyCode & e.KeyData) == Keys.Enter)
                if (((ComboBox)sender).SelectedItem == null)
                    e.IsInputKey = true;
        }

        private void ComboBox_KeyDown(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode & e.KeyData) == Keys.Enter)
            {
                if (((ComboBox)sender).SelectedItem == null)
                {
                    e.SuppressKeyPress = e.Handled = true;
                    ((ComboBox)sender).DataSource = accounts
                        .Where(a => a.Name.Contains(((ComboBox)sender).Text))
                        .ToList();
                    ((ComboBox)sender).DroppedDown = true;
                }
            }
        }

任何人都可以很容易地测试它,它对任何项目都有效。

相关问题