我的客户希望在应用程序的客户表单中有一个文本框,该表单提供了已启动街道名称的适用结尾.他开始输入一个街道名称,文本框提供了一个街道列表,这些街道以他在文本框中输入的字符序列开头.
我对自己说:没关系,文本框具有AutoCompleteCustomSource属性,即使常见的街道名称列表比启动时预先填充的更长,我可以用查询命中数据库,填充AutoCompleteStringCollection并显示对用户而言.
现在就是这样的事情:如果我在每个按键/键盘上填充列表,程序崩溃并抛出AccessViolationException.
我发现那是因为:控件正在显示自动完成列表的同时被修改,导致崩溃.
刷新自动完成列表时,将使用新指针重新创建控件.键盘和鼠标事件(KeyPress,MouseOver,MouseLeave,MouseHover)尝试引用旧控件的指针,这些指针现在在内存中无效,从而导致发生内存访问冲突.
基础AutoComplete实现不允许在窗口上设置AutoComplete候选列表对象后更改它.为了允许更改列表,WinForms会破坏Edit控件或ComboBox并重新创建它.如果在自动完成窗口仍在使用它时销毁基础控件,则会导致异常.
我在MSDN上看到了这个,他们的决议:
不要在关键事件期间动态修改自动完成候选列表.
我也尝试过这个帖子
那么,如果我坚持提供按键按键的适用街道名称,我怎么能做到这一点呢?
注意:我知道你可以通过创建一个自定义控件来实现这一点,但是它可以用纯粹的编码魔法来完成吗?
是否可以将控件锚定到另一个控件?
让我说我希望我的Button1与Textbox1控件保持4px的距离,而不
使用FlowLayoutTable控件?
__PRE__
好吧,假设您有一个带有垂直拆分器的SplitContainer,并且您
在SplitContainer.Panel1中有文本框,它们左右固定,但它们的最大尺寸
宽度小于您允许的SplitContainer.Panel1的宽度(可能
是因为你想要的)文本显示在那里或因为额外的填充或其他,你的名字)
现在假设您在Textbox1旁边还有一个按钮,并且您不希望Textbox1
与Button1重叠,因为它会延伸到远处.
如果我想让我的文本框以一种方式填充SplitContainer.Panel1,它为
Button1控制留出空间,同时它们两者都固定在右边,我该怎么做?
我只是不能,我猜测某些东西没有启用,但是什么?
