2017-09-05 3 views
1

J'essaie d'enregistrer un fichier de rapport sur le disque en utilisant un RichTextBox mais je reçois un fichier vide.RichTextBox créer un fichier vide

ReportRtb.Text = Report & Chr(9) & Source 
ReportRtb.SaveFile(FullReportPath, RichTextBoxStreamType.PlainText) 

Je ne comprends pas ce que je fais mal. Cette fonction est appelée à partir d'un thread, peut être liée?

+0

Il n'y a pas de code presque assez ici pour vous dire quoi que ce soit significatif –

+0

@AFriend L'autre partie de la fonction est de créer le chemin de nom de fichier. Avez-vous besoin de ça? –

+0

Eh bien, nous avons besoin d'un [MCVE] (https://stackoverflow.com/help/mcve) qui devrait inclure la façon dont vous générez 'FullReportPath' ainsi que les' Report' et 'Source'. –

Répondre

1

Oui ce problème est très certainement lié au deuxième thread que vous utilisez, car vous ne pouvez pas définir le texte d'un RichTextBox (ou tout autre contrôle sur un formulaire) à partir de tout autre thread, mais celui à partir duquel il a été créé.

Essayez d'utiliser le code suivant. Avec la déclaration Invoke(...)

ReportRtb.Invoke(Sub 
    ReportRtb.Text = Report & Chr(9) & Source 
    ReportRtb.SaveFile(FullReportPath, RichTextBoxStreamType.PlainText) 
End Sub) 

, vous pouvez appeler un lambda (ou un sous délégué, mais un lambda est plus facile ici) du fil le contrôle a été créé, donc ce définirez le texte correctement puis écrire au fichier. Si cela ne résout pas le problème, vérifiez le contenu de vos variables Report et Source avec Console.WriteLine(...) ou tout autre outil de sortie de journalisation/débogage.

Si cela ne fonctionne pas, vérifiez (avec un point d'arrêt) si la fonction est appelée du tout, et si c'est le cas, où le code s'arrête pour fonctionner.

Si tout cela échoue, envisagez d'implémenter votre propre code d'enregistrement, puisque vous utilisez uniquement RichTextBox pour écrire du texte brut. Cela pourrait se faire beaucoup plus efficace et plus rapidement avec le code suivant:

Dim sw As New StreamWriter(FullReportPath) 
sw.Write(Report & Chr(9) & Source) 
sw.Close() 'Never forget that because if you forget it, the file won't be written, too 
+0

Merci pour votre réponse. Le RTB n'est pas visible, je veux dire n'est pas sur l'interface graphique. Je le crée à l'intérieur de la fonction qui n'est appelée que par le thread. J'ai également essayé en appelant la fonction à partir d'un bouton sur l'interface graphique et obtenir le même résultat. Je vérifie la propriété RTB.Text et semble être ok. –

+0

StreamWriter fonctionne bien, merci! –

+0

Avez-vous essayé le point d'arrêt pour voir le contenu de vos variables et si elles sont correctes? Essayez également la solution StreamWriter au lieu de la RichTextBox, car la RichTextBox n'a pas été conçue pour fonctionner sans interface graphique et devrait être plus rapide et plus efficace. Ok, j'ai maintenant vu le commentaire que StreamWriter a fonctionné. Puis-je vous demander d'accepter ma réponse si cela a fonctionné pour vous alors? – Twometer