ComboBox不会失去焦点

时间:2009-08-02 17:54:04

标签: c# .net winforms combobox

我一直遇到ComboBox控件的问题。我不是GUI的专家,但我知道这个问题与控件的重点有关。

出于某种原因,当我在其外部点击时,ComboBox不会失去焦点。比如说:

  1. 我点击ComboBox列出其项目。
  2. 我选择了一个项目。这将关闭ComboBox。
  3. 我点击第二个ComboBox,第一个保持专注。
  4. OR

    1. 单击ComboBox(包含Point,Solid和Wireframe)。
    2. 点击表格。按P,S或W.查看选择更改。
    3. 请注意,ComboBox只将 DropDownStyle 设置为 ComboBoxStyle.DropDownList 。这意味着它是默认的ComboBox行为。我认为默认行为是当你单击它或其他控件(按钮或ComboBox)时,ComboBox会失去焦点。这不是这种情况,为什么?

      更新 我需要的是某种ActiveComponent = null。如果您在标准工具栏中选择Debug或Release(ComboBox),则行为应类似于Visual Studio中的行为。目前,如果我点击ComboBox外部,它仍然是焦点。

13 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:3)

您确定问题不是因为您的相框或其他组合框架无法获得焦点吗?

答案 2 :(得分:3)

您所要做的就是:

  1. 转到Combobox的属性窗口
  2. 并设置允许Drop =“true”
  3. 该属性仅用于其他目的,但也适用于此场景。

答案 3 :(得分:2)

那你到底在说什么?你是说没有调用你的_LostFocus()事件处理程序吗?如果是这样,我首先看到的是设计器生成的事件处理程序映射代码。有时,通过在设计师中做某些事情,这种方式会被解除(尽管这种情况很少见......)

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

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

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

它对我有用。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

  1. SendKeys.Send("{ESC}")之后; ComboBox仍然重新获得关注;

  2. 在组合框中将CausesValidation设置为false对我也没有帮助。

  3. 以下是我解决此问题的方法:

    假设您有另一个控件,例如System.Windows.Forms.PictureBox pbxChart,并且用户希望在更改combobox (selecting by Left Click or MouseWheel)中的值后将焦点移到那里。 所以我补充道:

        private void pbxChart_Click(object sender, EventArgs e)
        {
            pbxChart.Focus();
        }
    
    MouseClick EventHandler中的

    ,解决了这个问题。

答案 8 :(得分:0)

***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"

我通过注释掉第一行代码来解决问题(包括字符串Forms.Binding("Text", )。所以似乎只需要SelectedValue的语句。

答案 9 :(得分:0)

组合框取值的字典有,类型索引,类型值,类型索引必须是绑定在组合框架上的类属性中的相同类型。如果类型不同,组合框永远不会失去焦点。

答案 10 :(得分:0)

我知道这篇帖子已经有一段时间了,但也许它可以帮助将来遇到同样问题的人。我挣扎了好几天,但终于明白了。

如果您将CauseViolation设置为false,那么您无法解决问题,数据绑定也会停止工作。

当您将SelectedItem介绍给属性时如此

combobox.DataBindings.Add("SelectedItem", someObject, "MySelectedItemProperty", false, DataSourceUpdateMode.OnPropertyChanged)

combobox调用您在分配给DataSource的列表中使用的对象的Equals方法。就我而言,我需要覆盖此对象中的Equals方法。出于任何愚蠢的原因,组合框调用此方法并在实际传递正确的对象类型以进行比较之前传递System.DBNull。这是我的情况发生违规并导致违规失败的地方,因此不会从组合框中释放光标。另外奇怪的是,当我的Equals方法引起Exception时程序没有停止。

我添加此代码后

 if (obj.GetType() != this.GetType())
       return false;

我的Equals方法,一切正常。希望它可以帮到某人。

答案 11 :(得分:0)

 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}");

            }

答案 12 :(得分:0)

我这样做的方式如下。

第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);
    }

第2步-创建自定义事件

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

步骤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) ;
            }
        }
    }