2010-02-22 19 views
0

使用c#vs2008 winforms在Winforms FormClosing事件中引起的组合框异常

我有一个应用程序与一群孩子winforms。每当表单关闭时,我需要将每个表单上的组合框的当前选定值存储到全局应用程序变量中,以便我可以跟踪它并以新形式使用它。通过一种方法将组合框的数据源设置为项目的ArrayList,将组合框的数据源填充到组合框中。我发现的是,如果组合框在设计器中填充了项目,并且您尝试在窗体中获取组合框值关闭事件,我总是得到一个NullReferenceException

但是如果ComboBox有一个数据源,就像我DO在我的应用程序,我试图让表单关闭事件组合框的值,然后我会说95%的时间我DO NOT得到的NullReferenceException ,但我确实得到它5%的时间。这个比例甚至可以取决于我运行应用程序的计算机。例如,我有一台计算机,总是发生异常。

因此,我的问题是什么是(最好的)获取组合框的值的方法,在表单关闭之前的最后一件事情没有引发异常。我宁愿在表单关闭之前做最后的事情,而不是跟踪每个选定的索引更改事件。

任何意见赞赏。

回答

0

我猜你是当前的实现然后实际上是使用事件处理程序。我不确定你想要在代码中获取价值的位置,无论是表单代码本身还是其他地方。

什么我可能会做的是以下几点:

protected override void OnClosing(CancelEventArgs e) 
{ 
    // Save Value 

    base.OnClosing(e); 
} 
+0

我会试试这个,但是因为异常是间歇性的,所以需要一段时间才能看到它是否能够解决问题。是否有任何信息知道组合框/数据源/值成员是否应该在formclosing事件之前/期间或之后进行处理 – Spooky2010 2010-02-23 01:34:38

+0

我的意思是如果在组合框的数据源链接可以在表单关闭事件期间的任何时间处置,则会解释问题的间歇性,你的解决方案应该解决它。是的,不? – Spooky2010 2010-02-23 01:36:42

+0

@ Spooky2010:可能发生的事情是控件被释放,允许垃圾收集器消耗它们。这可能会解释这个问题,因为垃圾收集器以固定的时间间隔运行,但是您不知道这些可能是什么时候......您可能可以通过在代码之前添加一个GC.Collect()来测试旧代码你试图获得价值的地方,如果每次都失败,那么这很可能是你的问题。 – Ian 2010-02-23 09:06:48

0

您使用的是组合框的SelectedValue属性来访问所选择的项目?这将返回...

含有 的ValueMember属性中指定的数据源的 部件的值的对象。 (MSDN)

如果没有指定ValueMember,这可能是问题。如果您只想访问组合框中显示的字符串值,请尝试使用SelectedText属性。

+0

嗯,你是正确的,这就解释了为什么我得到的例外,当我测试不同的情况下,通过设计器输入项目的组合框。没有valuemember设置然而,应用程序本身确实有一个值成员集 – Spooky2010 2010-02-23 01:30:35

+0

它可能因为ValueMember所涉及的属性并不总是为ArrayList中的所有元素设置的 - 如果在任何情况下这些属性都为null,那么根据您对该值的尝试和操作,您可能会得到一个Null异常。你能发布你用来存储选定值的代码吗? – 2010-02-23 09:44:52