Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测哪个控件处于活动状态_C#_.net_Textbox_Listbox_Focus - Fatal编程技术网

C# 检测哪个控件处于活动状态

C# 检测哪个控件处于活动状态,c#,.net,textbox,listbox,focus,C#,.net,Textbox,Listbox,Focus,我有一个带有文本框和列表框的设置,我希望列表框只有在文本框或列表框聚焦时才可见。首先,列表框将不可见。然后,当文本框被聚焦时,列表框应该是可见的。只有当其中一方失去焦点且两方均未接收到焦点时,列表框才会再次变为不可见。因此,我希望做到的是,以下几点在任何时候都是正确的: listBox.Visible=textBox.Focused | | listBox.Focused 在我的解决方案中,文本框和/或列表框可以是标准类型的专门化(如果这简化了解决方案) 我尝试了监听控件LostFocus和Go

我有一个带有文本框和列表框的设置,我希望列表框只有在文本框或列表框聚焦时才可见。首先,列表框将不可见。然后,当文本框被聚焦时,列表框应该是可见的。只有当其中一方失去焦点且两方均未接收到焦点时,列表框才会再次变为不可见。因此,我希望做到的是,以下几点在任何时候都是正确的:

listBox.Visible=textBox.Focused | | listBox.Focused

在我的解决方案中,文本框和/或列表框可以是标准类型的专门化(如果这简化了解决方案)

我尝试了监听控件LostFocus和GotFocus事件,并在那里设置列表框的可见性。但是,从来没有在listbox上调用GotFocus事件,因为当textbox失去焦点时,我将其变为不可见

有人对如何实现这一目标有什么建议吗?我的备份计划(我不喜欢)是当一个失去焦点时计时器启动,而当另一个收到焦点时计时器停止。因此,如果能以“更清洁”的方式实现这一目标,我们将不胜感激;)

编辑:我正在开发此控件,用作.NET WinForms自定义控件

编辑2:

看来我对自己的解释还不够好。因此,我将尝试更明确地解释我想要实现的目标。

我正在创建一种新类型的文本框(继承我几年前构建的一种现有类型的文本框)。TextBox当前用作对象的通用集合(包括实现IList的子类型)。文本框定义一个列表框,该列表框根据一组条件显示集合中元素的子集。文本框添加到父控件时,列表框也会添加到父控件中。因此,这两项工作就像是一种在集合中搜索元素的设置。就像你开始打字时,浏览器会给出建议一样

我使用此设置而不是包含两个控件的UserControl,因为后者会导致UserControl的大小与两个控件的大小相同,或者(当大小与文本框匹配时)ListBox不可见

我意识到,我可以选择处理GotFocus或以添加此控件的窗体在所有控件上输入事件。这是我想到的一种非常简单的方法,但我更愿意编写一个控件,它不侦听表单中的每个控件


我希望这能澄清问题。

您可以做的是向表单上的所有其他控件添加一个
Enter
事件处理程序

private void OtherControls_Enter(object sender, EventArgs e)
{
  listBox.Visible = false;
}
编辑:
示例适用于WinForms,但也应适用于WPF

如果自定义控件仅包含
文本框
列表框
,则向
文本框
添加一个事件,以将
列表框
设置为可见:

private void textBox1_Enter(object sender, EventArgs e)
{
  listBox1.Visible = true;
}
如果有其他控件,请向其添加
OtherControls\u Enter
事件处理程序

在自定义控件的
Leave
事件中,添加如下内容:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.Controls["listbox1"].Visible = false;
}
编辑2:
更好的方法是从自定义控件中公开
列表框

public ListBox TheListBox { get { return listBox1; } }
然后:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.TheListBox.Visible = false;
}

以集中式方式实现所有控件输入事件,并检查发送者对象是否是您的文本框或列表框,然后列表框将可见或不可见

像这样

this.button1.Enter += new System.EventHandler(this.Control_Enter);
   this.textBox1.Enter += new System.EventHandler(this.Control_Enter);
   this.listBox1.Enter += new System.EventHandler(this.Control_Enter);

private void Control_Enter(object sender, EventArgs e)
    {
        Control obj = (Control)sender;
        if (obj.Name == "textBox1" || obj.Name == "listBox1")
        {
            listBox1.Visible = true;
        }
        else
        {
            listBox1.Visible = false;
        }
    }

别忘了分配控件选项卡索引

这种方法的唯一问题是,我正在开发一个自定义控件(我可能应该提到),因此,在将此自定义控件添加到窗体或面板时,我必须向所有控件添加处理程序。添加/删除所有这些处理程序的过程(包括在表单中添加/删除控件时)将很快导致事件混乱。此外,也不知道向控件添加了哪些其他类型的处理程序。此外,也不存在“OnFocus”事件。我假设您指的是“GotFocus”事件,并且您的事件处理程序的名称是正确的。您使用的是什么技术?WPF?ASP.NET?WinForms?自定义控件包含什么?仅文本框和列表框?更新了我的问题,以便回答您的问题。我不知道enter事件的工作原理与gotfocus类似,但这对我来说并不适用。我没有创建包含两个控件的用户控件。我应该在这一点上重新写我的问题,以便更准确地解释我试图实现的目标。我尝试了上述方法,效果很好。您真正需要的只是这三个事件处理程序。只要把它们连接到正确的控制装置上就行了。即,在自定义控件中的所有其他控件上重复使用
OtherControls\u Enter
。当然,这假定
列表框
位于自定义控件中。