在开发一个自定义下拉控件时,由于需要的是一个可调整尺寸的弹出窗口,因此使用了动态生成窗口的方法,在控件的构造过程中生成了一个窗口。在显示下拉列表时显示该窗口,并使用BringToFront()方法将窗口显示在前方。控件功能正常。
使用了一段时间后,用户要求增加类似IE地址栏那样的自动完成功能。即在文本框中输入数据时,弹出窗口并在列表中自动定位匹配的条目,回车确认后自动选择该条目。在增加此功能的过程中,我遇到了一个问题,那就是由于下拉列表与输入数据的文本框不在同一个窗口,一旦输入数据并在列表中找到该记录,并将该记录设置为选中状态,文本框就会失去焦点,这显然是不行的,还要使用Focus()将文本框设置焦点。
问题这时出现了,一旦文本框得到焦点,下拉列表窗口显示到当前自定义下拉控件所在窗口的后面去了。为了解决这个问题,我使用了窗口的TopMost属性将窗口设置为顶层。
... {
public ComboEx()
...{
......
Form frmList=new Form();
frmList.TopMost=true;
......
}
private void ShowList()
...{
frmList.show();
frmList.BringToFront();
}
}
但是在运行时发现问题没有解决,下拉列表窗口还是会显示到后面去了。后来我无意中将“frmList.TopMost=true;”放在了Show()方法的后面,发现问题解决了。我随后又将语句放在Show()的前面,发现问题又出来了。
... {
public ComboEx()
...{
......
Form frmList=new Form();
frmList.TopMost=true;
......
}
private void ShowList()
...{
frmList.show();
frmList.TopMost=true;
frmList.BringToFront();
}
}
我不知道为什么会这样,按理生成该窗口时设置了这个属性就应该起作用,象在工程开发时添加的窗口对象,一设置了这个属性后,显示时就看到效果了。而这次就不行了,难道是因为这个窗口是动态生成的原因,我对系统底层不是很了解,能力也有限,无法找到答案。只好记录下来,希望对大家有些帮助。