问题描述
写了一个日志窗口logForm,包含一个ListBox显示日志内容,当日志满200行的清除所有内容,但是报错,提示未将对象引用设置到对象的实例代码如下:if(this.logForm.listBoxLog.Items.Count>200)this.logForm.listBoxLog.Items.Clear();
解决方案
解决方案二:
单步调试一下,看看那个是null。目测是this.logForm.listBoxLog.Items
解决方案三:
不是时时都出现,软件一直运行,都是晚上十一点多,或者凌晨一点多出现错误
解决方案四:
引用1楼u011303459的回复:
单步调试一下,看看那个是null。目测是this.logForm.listBoxLog.Items
[目测是this.logForm.listBoxLog.Items]去掉
解决方案五:
都是深夜这么奇怪?是否记录与时间跨度相关的东西了?
解决方案六:
目测是内存的问题
解决方案七:
this.logForm.listBoxLog.Items.Clear();这句话有没有执行呢,按照道理上面已经加了判断了,不会报错的。
解决方案八:
测试没有任何问题
解决方案九:
而且还纳闷地一点是,先判断了数量大于200行才执行的,应该不会null啊
解决方案十:
日志记录的内容,和时间跨度没有什么关系this.logForm.listBoxLog.BeginUpdate();this.logForm.listBoxLog.Items.Add(DateTime.Now.ToString()+":"+logContent);this.logForm.listBoxLog.EndUpdate();this.logForm.listBoxLog.SelectedIndex=this.logForm.listBoxLog.Items.Count-1;
解决方案十一:
现在又出现了这种问题,不知道哪里有问题
解决方案十二:
this.logForm.listBoxLog.SelectedIndex=this.logForm.listBoxLog.Items.Count-1;这句有问题。COUN-1.INDEX.
解决方案十三:
这里确实会引发错误,但是错误日志提示的位置不在这里privatevoidOutPutLogs(LogLevellogLevel,stringlogContent){lock(this){switch(logLevel){caseLogLevel.Info:this.logForm.listBoxLog.BeginUpdate();this.logForm.listBoxLog.Items.Add(DateTime.Now.ToString()+":"+logContent);this.logForm.listBoxLog.EndUpdate();if(this.logForm.listBoxLog.Items.Count>0)this.logForm.listBoxLog.SelectedIndex=this.logForm.listBoxLog.Items.Count-1;break;default:break;}}}
解决方案十四:
2014-6-311:38:19:线程异常:未将对象引用设置到对象的实例。StackTrace:在System.Windows.Forms.ListBox.ItemArray.GetActualIndex(Int32virtualIndex,Int32stateMask)在System.Windows.Forms.ListBox.ItemArray.GetItem(Int32virtualIndex,Int32stateMask)在System.Windows.Forms.ListBox.SelectedObjectCollection.get_Item(Int32index)在System.Windows.Forms.ListBox.get_SelectedItem()在System.Windows.Forms.ListBox.get_Text()在System.Windows.Forms.Control.OnHandleDestroyed(EventArgse)在System.Windows.Forms.ListBox.OnHandleDestroyed(EventArgse)在System.Windows.Forms.Control.WmDestroy(Message&m)在System.Windows.Forms.Control.WndProc(Message&m)在System.Windows.Forms.ListBox.WndProc(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)在System.Windows.Forms.NativeWindow.Callback(IntPtrhWnd,Int32msg,IntPtrwparam,IntPtrlparam)我加快了日志的记录和显示,在自己电脑上还是没有重现这个问题,今天又在同事的电脑上测试出来了,上面是捕获的错误日志
解决方案十五:
如果我说无解你信吗?我有一个程序exe一直在运行..同样的也是listbox添加日志..代码跟你差不多也是清除日志..甚至我添加了右键清除..listBox1.Items.Clear();
就这代码运行了一段时间就有问题..不管是大于200或者按钮清除.就是null...实际上就算listbox1没有任何东西的时候这句也不会有问题..但是就是这点运行一段时间...所以我个人认为是无解...希望借用你的帖子找到解决问题的方法..
解决方案:
推荐采用异步委托方式privatevoidOutPutLogs(LogLevellogLevel,stringlogContent){lock(this){switch(logLevel){caseLogLevel.Info:showLst(logContent);break;default:break;}}}//采用异步委托方式privatedelegatevoidAsyncCallBack(stringcontents);privatevoidshowLst(stringlogContent){if(this.logForm.listBoxLog.InvokeRequired){AsyncCallBackasy=newAsyncCallBack(showLst);this.Invoke(asy,logContent);return;}else{this.logForm.listBoxLog.BeginUpdate();this.logForm.listBoxLog.Items.Add(DateTime.Now.ToString()+":"+logContent);this.logForm.listBoxLog.EndUpdate();if(this.logForm.listBoxLog.Items.Count>0)this.logForm.listBoxLog.SelectedIndex=this.logForm.listBoxLog.Items.Count-1;}}
解决方案:
引用14楼diaodiaop的回复:
如果我说无解你信吗?我有一个程序exe一直在运行..同样的也是listbox添加日志..代码跟你差不多也是清除日志..甚至我添加了右键清除..listBox1.Items.Clear();就这代码运行了一段时间就有问题..不管是大于200或者按钮清除.就是null...实际上就算listbox1没有任何东西的时候这句也不会有问题..但是就是这点运行一段时间...所以我个人认为是无解...希望借用你的帖子找到解决问题的方法..
今天出现这个错误的时候,我打开logForm,里面什么东西都没有,而滚动条只滑到一半
解决方案:
http://social.msdn.microsoft.com/Forums/en-US/8ab8e6d7-098e-4ff5-8cae-8ded5b31acf8/nativewindowcallback-and-windows-forms-timer
解决方案:
不知道是不是和这个有关系NativeWindow.CallbackandWindowsFormsTimer
解决方案:
我也遇到了这个问题,经过试验,估计找到了原因。虽然这个帖子已经很古老了,但是我相信还会有后来人像我们一样遇到这个问题。所以我把我找到的原因和解决过程写下来。出现这个问题的原因是ListBox控件的Selected系列属性(SelectedIndex,SelectedItem)。当你控件中的选项被选中过(即SelectedIndex不为-1,SelectedItem不为null)后,如果你删除被选中的项,或者将SelectedIndex设置为-1,或者将SelectedItem设置为null,或者使用SetSelected函数将被选中的项设置为false,均会出现这个错误。也就是说,ListBox控件一旦有子项被选中,那么必须一直有选中项,你可以改变选中项,但是不能取消选中项。如果你删除不是SelectedIndex指定的项,则不会出现问题。解决问题的思路:如果你要删除SelectedIndex指定的项,可以首先修改SelectedIndex值,然后再删除:1、如果SelectedIndex不是最后一项,将其修改为SelectedIndex+1;2、如果SelectedIndex是最后一项,且总项数量不为1,将其修改为SelectedIndex-1;3、如果总项数量为1,则使用Clear清空代码如下:intindex=listBox.SelectedIndex;if(index<0)return;elseif(index<listBox.Items.Count-1){listBox.SelectedIndex=index+1;listBox.Items.Remove(listBox.Items[index]);}elseif(index>0){listBox.SelectedIndex=index-1;listBox.Items.Remove(listBox.Items[index]);}else{listBox.Items.Clear();}当然更简单的方法是使用try,不去管报错。我的方法比较笨,如果你有更好的方法,请写下来,大家一起研究。
解决方案:
收藏了。谢谢。