2011-07-10 7 views
5

I wydają się być przeżywa bardzo nietypowy problem z kontrolą RichTextBox, programowania w języku C# w Visual Studio 2008.RichTextBox nie przetwarza nowe postacie powrotów linii/karetki

Jestem obecnie czytania strumienia pliku, który jest będącego napisany do konsoli Windows (z przekierowaniem wyjścia) i czytam go do mojego programu (w zasadzie odtwarzam to, co jest znane w świecie unixów jako "ogon").

Kiedy zostanie odczytana tablica bajtów, chciałbym powrócić do nowej linii i kontynuować czytanie. Wygląda jednak na to, że mój RTB nie zareaguje na znaki nowej linii lub znaku powrotu karetki. Na przykład próbowałem dołączyć \n, \r\n, a nawet Environment.NewLine do napisanego ciągu, ale nic nie działa. Po prostu pisze w tej samej linii.

Oto kod, który wydaje się być przyczyną problemów:

string convertedBuffer = System.Text.Encoding.UTF8.GetString((byte[])e.UserState); 

outputBox.AppendText(convertedBuffer + "\n"); 

Jestem naprawdę ze stratą tutaj, może ktoś pomóc?

Odpowiedz

5

To prawdopodobnie dlatego, że ustawiono właściwość outputBox.Multiline na wartość false, co uniemożliwi sterowanie wyświetlaniem tekstu wieloliniowego.

Edit: Ty podano w komentarzu

tablica bajtów, który jest wysyłany był jeden, że z wielkości zadanej, 512. I teraz właśnie się zmienił, że do jednego, że rzeczywiście pasuje dane są wypełnione w nim, a teraz, nagle, na znak nowej linii zaczyna działać ponownie

Oto co się stało:

Klasa C# string jest tablicą char Rozpocznij od wskaźnika do pierwszego znaku w tablicy, a kończy się specjalnym znakiem "terminal": \0. Więc jeśli zadzwonisz pod numer System.Text.Encoding.UTF8.GetString(buffer), jeśli rozmiar bufora jest większy niż rozmiar ciągu, ustawi on wszystkie pozostałe znaki ciągu na znak końca w tablicy znaków. tablica znaków będzie podobna do some text\0\0\0, więc jestem zgadywanie, że po dodaniu Environment.NewLine doda go do ostatniego indeksu tablicy znaków po ostatnim \0, a następnie tablicy znaków będzie some text\0\0\r\n i ze względu na nową linię jest po terminalu, zignoruje to.

+0

To byłby Domyślam się też, że wartość Multiline jest niestety prawdziwa. Aby uzyskać więcej informacji, kiedy przypisuję właściwość Tekst zamiast dodawać do niej, wydaje się, że znaki nowego wiersza są w pełni rozpoznane, ponieważ widzę, jak mój kursor przesuwa się w dół o dwie linie za pomocą \ n \ n. Jednak w powyższym bloku kodu nadal nie działa. – TGP1994

+0

@ TGP1994: To jest dziwne. Sprawdziłem: Dodałem nowy "Form" 'Form1' i dodałem do niego nowy' richTextBox1' z jego domyślnymi wartościami. Teraz przy kodzie oceniamy linię dodawania wielokrotnego, jak 'richTextBox1.AppendText (" Testowanie ... "+ Environment.NewLine); richTextBox1.AppendText ("Testowanie ..." + Environment.NewLine); 'Będzie działać zgodnie z oczekiwaniami ... –

+0

Co powiesz na dodanie łańcucha, który został wygenerowany z System.Text.Encoding.UTF8.GetString()? – TGP1994

-2

Wystarczy umieścić "\ n" lub Environment.NewLine oddzielnie w następujący sposób:

outputBox.AppendText(convertedBuffer); 
outputBox.AppendText("\n"); 

To działa dla mnie ... i nie trzeba się martwić o \ 0

+0

Dzięki za próbę, Jakub. :) Obawiam się, że spóźniłeś się kilka lat i poprawna odpowiedź jest krótka ... Na moje pytanie dodałem już znak nowej linii. – TGP1994

+0

Cześć, tak, spóźniłem się z reklamą, miałem ten sam problem. Niestety, dodajesz nową linię razem ze stringami, co spowodowało, że problem. Kiedy go odseparuję, działa to dla mnie ;-) – Jakub