我希望有人可以告诉我可能导致此错误的原因:
尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
我不能真正发布代码,因为这个错误似乎被抛出应用程序的任何随机区域.应用程序将在抛出错误之前的12-48小时内运行.有时它会在一个看似随机的位置停止并抛出上述错误,其他时候整个应用程序停止并且我得到一个错误的屏幕,上面写着"有一个致命的错误...这可能是一个CLR中的错误或......"关于PInvoke或其他非相关信息的内容.发生这种情况时,所有线程都显示终止,并且没有可用的调试信息.
简而言之,这就是应用程序的作用:
它是一个完全用C#编写的多线程服务器应用程序.客户端通过套接字连接到服务器.服务器为客户端运行虚拟"环境",以便他们可以相互交互并与环境进行交互.它消耗了相当多的内存,但我没有看到它泄漏.它通常消耗大约1.5GB.我认为它没有泄漏,因为内存使用在应用程序运行的整个时间内保持相对稳定.即使客户端没有做任何事情,它也会不断运行代码来维护环境.它不使用第三方软件或其他API.此应用程序使用的唯一外部资源是套接字连接和SQL数据库连接.它运行在64位服务器上.我尝试使用.net 2.0,3.5和4在VS2008和VS2010中进行调试.
我试过关闭编译器优化和几个微软热修复.似乎没有什么能让这个问题消失.如果有人知道任何可能的原因,或某种方式来确定导致问题的原因,将不胜感激.
我有一个DropDown类型的ComboBox控件,其中包含"AAA","Aaa","Aa +"等项目.
问题是:如果我键入Aaa,项目"AAA"突出显示为选中,而不是"Aaa".我假设组合框使用FindString来查找SelectedItem - 因此搜索结果等同于第一个匹配的项目不区分大小写的字符串.StartsWith.
我需要更改什么才能覆盖此行为?
我需要能够输入ComboBox.
我是否可以覆盖winforms中的方法或类似于来自sll的答案的WPF IsTextSearchCaseSensitive属性的某种属性?
我有一个组合框,它是与包含数据库中的行的数据网格相关的详细信息显示的一部分。不存在对组合框的绑定,我正在手动执行此操作。组合框允许手动输入,就像它是一个文本字段一样,同时仍然提供下拉选项。
我的问题是,如果我在字段中手动输入文本,并且单击下拉菜单,则组合框显然想要寻找匹配项。另外,看起来搜索很简单,因此KG匹配KG/Day。我必须避免这种情况并强制进行精确匹配。
但更进一步,我认为我需要能够自己管理整个过程,因为让事情变得更加复杂的是,下拉项实际上会显示为KG/Day - kilograms/day。然而,从中获取数据的数据库字段仅存储连字符之前的部分,因此KG/Day。
因此,我需要以允许我做两件事的方式拦截下拉操作:
1)执行我自己的搜索以查找我是否有临时文本或“真实”匹配。因为它最初是从下拉列表中选择的;换句话说,我有KG/Day,而不仅仅是KG。
2)消除ComboBox想要做的自动搜索行为。
我尝试使用表单中的方法处理程序来解决这些问题,例如
ComboBox::DropDown() 和 ComboBox::DropDownClosed(),
但似乎这些仍然不允许我停止基本的 ComboBox 搜索/匹配。
我也尝试创建一个从 ComboBox 继承的我自己的类,但我真的不知道要重写什么,或者一般如何去获得我想要的东西,停止我不想要的东西。
因此,我感谢您的建议。
编辑:扩展我已经尝试过的内容...在我继承的类中,我试图使用覆盖WndProc。根据我在另一个论坛中找到的一些建议,我的目标是拦截 ComboBox 消息LB_FINDSTRING并将其替换为LB_FINDSTRINGEXACT. 该帖子建议 ComboBox 默认为LB_FiNDSTRING,这符合我所看到的效果,并且替换LB_FINDSTRINGEXACT可以解决问题。问题是,除非我对 的定义有错误LB_FINDSTRING,否则它永远不会被收到。
这是我的枚举:
[Flags]
public enum ListBoxFlags
{
LB_ADDSTRING = 0x0180,
LB_SETSEL = 0x0185,
LB_GETSELITEMS = 0x0191,
LB_GETSELCOUNT = 0x0190,
LB_GETCURSEL = 0x0188,
LB_SELECTSTRING = 0x018C,
LB_SETCURSEL = 0x0186,
LB_FINDSTRING = 0x018F, …Run Code Online (Sandbox Code Playgroud)