2017-08-14 121 views
0

我正在創建一個C#WinForms應用程序,該應用程序會創建PDF並將每個PDF的名稱輸出到富文本框中。我使用ScrollToCaret功能在創建每行時自動滾動文本框。作爲附加的細節,打印方法與WinForm分開。ScrollToCaret在焦點丟失時拋出空引用異常

我遇到的問題是,當程序失去焦點,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(); 
    } 

與附加文本

型 'System.NullReferenceException' 未處理的異常發生在PDFGenerator.exe

附加信息:未將對象引用設置爲對象的實例。

如果程序沒有失去焦點,程序不會遇到任何問題,但如果程序在生成PDF時失去焦點,則會一直拋出此異常。

該程序需要一兩分鐘的時間才能運行,所以在後臺運行它的能力非常重要。

當程序失去焦點時,如何停止ScrollToCaret拋出一個Null引用異常?我必須使用WinForms RichTextBox的其他功能嗎?

編輯:我明白什麼是空引用異常;我不明白爲什麼當winform被明確實例化並且運行時拋出它,但是當程序失去焦點時停止運行。我還沒有發現有任何文檔說Winform或其子組件在Winform失去焦點時無法實際展現。

+0

也許你應該檢查看看錶單是否爲空。 – LarsTech

+0

@LarsTech表單不爲空 - 否則它不能打印,我不明白爲什麼表單在失去焦點時會變爲null。除非我誤解你的評論。 –

+0

在演員陣容剛剛添加之後添加以下檢查。它應該解決你的問題。 if(form == null)return; – CharithJ

回答

-1

當應用程序沒有焦點時,ActiveForm可能爲空。

Form.ActiveForm Property

表示當前活躍的形式,或者爲空,如果有 無活性形式的形式。

只需在演員結束後添加空檢查就可以跳過您的問題。但是,處理空引用不是解決您的問題的方法。您需要找到更好的方法將PDFGenerator.Form1實例傳遞給您的Print方法。

var form = Form.ActiveForm as PDFGenerator.Form1; 

if (form == null) 
    return; 
+1

重新打開一個明確的副本是不合適的,因此您可以發佈答案。當問題實際上沒有足夠的信息來發布真實的答案時,情況尤其如此。以上是純粹的猜測。 OP沒有提供可靠地再現問題的良好[mcve]。請注意,即使他們有,並且即使您的答案解決了這個問題,這完全是在規範副本中找到的建議,因此將會是不適當的,並且對Stack Overflow站點根本沒有任何有用的貢獻。 –

+0

_「這裏的主要觀點是,ActiveForm在失去焦點時爲空」_ - 不,它不是。 OP聲稱在調用ScrollToCaret()時會發生異常。如果'form'是你推斷的null,那麼代碼永遠不會得到那麼多,因爲在那之前該變量被解引用了兩次。無論如何,對這個問題的編輯並沒有改善它的一點;他們仍然在質疑爲什麼拋出異常。他們沒有做任何事情來表明它只是一個實際的空引用,並且處理這些是直接由副本處理的。 –

+1

謝謝,儘管我的問題沒有得到很好的框架,但你確切地回答了我的問題。我不知道形式的特殊屬性.Activeform。 –