C# 组合框不会失去焦点

C# 组合框不会失去焦点,c#,.net,winforms,combobox,C#,.net,Winforms,Combobox,我的组合框控件一直有问题。我不是GUI方面的专家,但我知道这个问题与控件的焦点有关 出于某种原因,当我在组合框外单击时,它不会失去焦点。比如说: 我点击组合框来列出它的项目 我选择一个项目。这将关闭组合框 我点击第二个组合框,第一个保持焦点 或 单击组合框(包含点、实体和线框) 点击表格。按P、S或W。查看所选内容是否已更改 请注意,ComboBox仅将DropDownStyle设置为ComboBoxStyle.DropDownList。这意味着它是默认的组合框行为。我认为默认行为是,当您单击组

我的组合框控件一直有问题。我不是GUI方面的专家,但我知道这个问题与控件的焦点有关

出于某种原因,当我在组合框外单击时,它不会失去焦点。比如说:

  • 我点击组合框来列出它的项目
  • 我选择一个项目。这将关闭组合框
  • 我点击第二个组合框,第一个保持焦点
  • 单击组合框(包含点、实体和线框)
  • 点击表格。按P、S或W。查看所选内容是否已更改
  • 请注意,ComboBox仅将DropDownStyle设置为ComboBoxStyle.DropDownList。这意味着它是默认的组合框行为。我认为默认行为是,当您单击组合框或其他控件(按钮或组合框)时,组合框将失去焦点。这里不是这样,为什么

    更新:
    我需要的是某种ActiveComponent=null。当您在标准工具栏中选择“调试”或“发布”(组合框)时,该行为应该类似于Visual Studio的行为。目前,如果我在组合框外单击,它仍然是焦点

    那你到底在说什么?您是说没有调用您的_LostFocus()事件处理程序吗?如果是这样的话,我将首先查看设计器生成的事件处理程序映射代码。有时,通过在设计器中执行某些操作,会有一种脱离关联的方式(虽然现在很少…

    您确定问题不是因为您的框架或其他组合框都没有获得焦点的方式吗?

    您可能想看一看。尝试在组合框中将CausesValidation设置为false,看看是否可以保留它。如果OnValidating事件处理程序中抛出异常,它将不会取消选择该框。

    我遇到了类似的问题,但控件递归地丢失并重新获得焦点;正在调用
    LostFocus
    事件处理程序,但控件立即恢复了焦点。将
    CausesValidation
    属性设置为
    false
    无效

    在我的例子中,当绑定到自定义对象时,我绑定到了
    SelectedValue
    属性,而不是
    Text
    属性。因为我手动指定了ComboBox项集合,并且没有提供数据源,
    ValueMember
    属性丢失或无效(因此,
    SelectedValue
    属性当然没有用。)


    将我的绑定更改为使用
    Text
    属性解决了这个问题。

    我遇到了类似的问题,并尝试了你们建议的所有方法。不幸的是,它们都不起作用。以下是我的“简单”解决方案:更改所选索引后,发送一个“ESC”键

    ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    # do whatever you were doing
    ...
    ...
      SendKeys.Send("{ESC}");
    }
    

    它对我很有用。

    ***form.Designer.vb中,每个组合框都有一些代码,如:

    'OrgDetailsIDComboBox
    '
    Me.OrgDetailsIDComboBox.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.MedicoLegalBindingSource, "OrgDetailsID", True))
    Me.OrgDetailsIDComboBox.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", Me.MedicoLegalBindingSource, "OrgDetailsID", True))
    Me.OrgDetailsIDComboBox.DataSource = Me.OrgBindingSource
    Me.OrgDetailsIDComboBox.DisplayMember = "Place"
    

    我通过注释掉第一行代码(包括string
    Forms.Binding(“Text”)和
    )解决了这个问题。因此似乎只需要
    SelectedValue
    的语句。

    尝试离开事件而不是LostFocus。
    尝试输入事件而不是GotFocus。

    您只需执行以下操作:

  • 转到Combobox的属性窗口
  • 并设置Allow Drop=“true”

  • 该属性用于其他用途,但也适用于此场景。

    combobox获取值的字典具有,类型索引,类型值,类型索引必须与绑定在combobox上的类属性中的类型相同。如果类型不同,combobox将永远不会失去焦点。

    我知道这是一个很长的时间这篇文章很好,但也许它会帮助将来遇到同样问题的人。我为此奋斗了几天,但最终还是找到了答案

    如果将CauseViolation设置为false,则无法解决问题,数据绑定将停止工作

    当你介意选择像这样的属性时

    combobox.DataBindings.Add("SelectedItem", someObject, "MySelectedItemProperty", false, DataSourceUpdateMode.OnPropertyChanged)
    
    combobox调用在分配给数据源的列表中使用的对象的Equals方法。在我的情况下,我需要覆盖此对象中的Equals方法。无论出于何种愚蠢的原因,combobox调用此方法并在实际传递正确的对象类型进行比较之前传递System.DBNull。这就是发生冲突的地方在我的例子中,它会导致冲突失败,因此没有从组合框中释放光标。另外,奇怪的是,当我的Equals方法中出现异常时,程序没有停止

    一旦我添加了这个代码

     if (obj.GetType() != this.GetType())
           return false;
    
    按照我的方法,一切都很好。希望它能帮助别人

  • SendKeys.Send(“{ESC}”)
    之后,
    组合框仍然保持焦点

  • 将组合框上的
    CausesValidation
    设置为false对我也没有帮助

  • 以下是我如何解决此问题的:

    假设您有另一个控件,例如
    System.Windows.Forms.PictureBox pbxChart
    ,在更改
    组合框(通过左键单击或鼠标滚轮选择)中的值后,用户希望将焦点移到此处。
    所以我补充说:

        private void pbxChart_Click(object sender, EventArgs e)
        {
            pbxChart.Focus();
        }
    
    鼠标单击EventHandler
    ,解决了问题

     private void drp_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (e.KeyChar == 13)
                {
                    SendKeys.Send("{TAB}");
                }
            }
    
    或使用

    此代码用于控制休假功能:

     private void drp_Leave(object sender, KeyPressEventArgs e)
                {
    
                        SendKeys.Send("{TAB}");
    
                }
    

    我做这件事的方式如下

    步骤1-创建一个返回表单上所有给定控件的方法

        public IEnumerable<Control> GetAllControls(Control control, Type type)
        {
            var controls = control.Controls.Cast<Control>();
            return controls.SelectMany(ctrl => GetAllControls(ctrl, type))
                                      .Concat(controls)
                                      .Where(c => c.GetType() == type);
        }
    
    步骤3-在表单加载时最终绑定事件

        private void ClientRegistrationForm_Load(object sender, EventArgs e)
        {
            var comboxes=_Helper.GetAllControls(this, typeof(ComboBox)).ToList();
            if (comboxes != null)
            {
                foreach (ComboBox item in comboxes)
                {
                    item.SelectedIndexChanged +=new EventHandler(this.ChangeComboFocus) ;
                }
            }
        }
    

    我没有为ComboBox定义任何自定义休假事件,但是如果我定义了并设置了断点,我可以看到它显然没有被调用。我已经尝试过了,但我没有看到这种行为的痕迹。您使用的框架的版本是什么?您是否设置了任何不允许它显示为焦点的属性?AllowSelection?我建议您创建另一个表单from抓取并查看行为是否不同。然后在当前表单和新表单之间进行区分,以查看-原因是什么?出于我的目的
        private void ClientRegistrationForm_Load(object sender, EventArgs e)
        {
            var comboxes=_Helper.GetAllControls(this, typeof(ComboBox)).ToList();
            if (comboxes != null)
            {
                foreach (ComboBox item in comboxes)
                {
                    item.SelectedIndexChanged +=new EventHandler(this.ChangeComboFocus) ;
                }
            }
        }