C# 当焦点丢失时,ScrollToCaret引发空引用异常

C# 当焦点丢失时,ScrollToCaret引发空引用异常,c#,winforms,C#,Winforms,我正在创建一个C#WinForms应用程序,它可以创建PDF,并在创建PDF时将每个PDF的名称输出到一个富文本框中。我使用ScrollToCaret功能在创建每一行时自动向下滚动文本框。另外,print方法与WinForm在一个单独的类中 我遇到的问题是,每当程序失去焦点时,ScrollToCaret函数就会抛出一个NullReferenceException 这是每次抛出错误的代码段: private void Print<T>(T str) { var

我正在创建一个C#WinForms应用程序,它可以创建PDF,并在创建PDF时将每个PDF的名称输出到一个富文本框中。我使用ScrollToCaret功能在创建每一行时自动向下滚动文本框。另外,print方法与WinForm在一个单独的类中

我遇到的问题是,每当程序失去焦点时,ScrollToCaret函数就会抛出一个NullReferenceException

这是每次抛出错误的代码段:

private void Print<T>(T str)
    {
        var form = Form.ActiveForm as PDFGenerator.Form1;
        
        try
        {
            form.richTextBox1.AppendText(str + Environment.NewLine);
        }
        catch
        {
            form.richTextBox1.AppendText("Couldn't print string");
        }

        form.richTextBox1.ScrollToCaret();
    }
private void打印(T str)
{
var form=form.ActiveForm作为PDFGenerator.Form1;
尝试
{
form.richTextBox1.AppendText(str+Environment.NewLine);
}
接住
{
form.richTextBox1.AppendText(“无法打印字符串”);
}
form.richTextBox1.ScrollToCaret();
}
附加文本

PDFGenerator.exe中发生类型为“System.NullReferenceException”的未处理异常

其他信息:对象引用未设置为对象的实例

如果程序没有失去焦点,它不会遇到任何问题,但如果在生成PDF时失去焦点,它会始终抛出此异常

程序运行需要一两分钟,因此在后台运行它的能力很重要

当程序失去焦点时,如何阻止ScrollToCaret抛出空引用异常?我必须使用WinForms RichTextBox的其他功能吗


编辑:我理解空引用异常是什么;我不明白为什么当winform被清晰地实例化并运行时,它会被抛出,但当程序失去焦点时,它会停止运行。我没有发现任何文档说明winform或其子组件在winform失去焦点时无法实例化。

当应用程序没有焦点时,ActiveForm可能为空

表示当前活动窗体的窗体,如果存在,则为null 没有活动表单

只需在强制转换后添加空检查,即可跳过您的问题。但是,处理空引用并不是解决问题的方法。您需要找到更好的方法将PDFGenerator.Form1实例传递给打印方法

var form = Form.ActiveForm as PDFGenerator.Form1;

if (form == null)
    return;

也许你应该检查一下表单是否为空。@如果表单不是空的,那么它首先就不能打印,我不明白为什么表单在失去焦点时会变成空的。除非我误解了你的评论。在你的演员阵容之后添加以下检查。它应该能解决你的问题。if(form==null)返回;当情况恶化时,您必须调试程序以查看这些值是什么。
str
可以是字符串以外的任何东西吗?我不知道你为什么用泛型?您可以避免整个问题,只需自己传递表单引用
void Print(string str,Form1 form)
@LarsTech它是通用的,因为有一段时间我同时传递字符串和其他值(int、double等)。我会试试你的建议。重新打开一个清晰的副本是不合适的,只是为了你可以发布一个答案。当问题事实上没有足够的信息让你发布真实答案时,这一点尤其正确。以上纯属猜测。OP没有提供可靠重现问题的好方法。请注意,即使他们有,即使您的答案解决了这个问题,这正是在规范副本中找到的建议,因此仍然是不适当的,对堆栈溢出站点没有任何帮助。“这里的要点是ActiveForm在失去焦点时为空”——不,不是。OP声称调用
ScrollToCaret()
时发生异常。如果
form
如您所推断的那样为null,那么代码就不会走那么远,因为在此之前该变量被解引用了两次。在任何情况下,对问题所做的编辑都不会改善它一点;他们仍然在问为什么抛出异常。他们没有做任何暗示,这只是一个实际的空引用,处理这些问题是由副本直接解决的。谢谢,尽管我的问题框架很差,但你完全回答了我的问题。我不知道form.Activeform的那个特殊属性。@DmitriS:我不认为你的问题框架不好。您已经提供了足够的详细信息和代码。这不是关于处理NullReference异常。这都是关于复杂的ActiveForm属性。无论如何,我很高兴这回答了你的问题。