2009-11-23 32 views
5

Tôi đã xây dựng một thư viện chứa hầu hết văn bản gỡ lỗi của nó bằng cách sử dụng Console.WriteLine();Đầu ra của bảng điều khiển chuyển hướng đến winforms ListBox

Tôi hiện là quá trình sử dụng thư viện trong Ứng dụng Biểu mẫu Windows và vẫn cần quyền truy cập vào đầu ra Bảng điều khiển. (Để hiển thị trong một hộp danh sách/RichText)

Tôi nhận thấy tôi có thể ghi đè lên tiêu chuẩn ra khỏi bàn điều khiển để TextWriter, nhưng làm thế nào sau đó tôi sẽ nhận được dữ liệu này vào màn hình.

I Tried làm một cái gì đó dọc theo dòng của

public partial class Form1 : Form 
    { 
    Timer T; 
    MemoryStream mem; 
    StreamWriter writer; 


    public Form1() 
    { 

     InitializeComponent(); 
     mem = new MemoryStream(1000); 
     writer = new StreamWriter(mem); 
     Console.SetOut(writer); 

     T = new Timer(); 
     T.Interval = 250; // yes this probally is to short. 
     T.Tick += new EventHandler(T_Tick); 
     T.Start(); 


     Console.WriteLine("output"); 
     Console.WriteLine("AnotherLine"); 
    } 

    void T_Tick(object sender, EventArgs e) 
    { 
     string s = Encoding.Default.GetString(mem.ToArray()); 
     string[] Lines = s.Split(Environment.NewLine.ToCharArray()); 
     Output.Items.Clear(); // Output is a listbox 
     foreach (string str in Lines) 
      Output.Items.Add(str); 
    } 
} 

nhưng vô ích. Bất kỳ ý tưởng?

Mã không cần phải loại bỏ.

Trả lời

12

Một cách khác, có thể là sạch hơn để thực hiện việc này là mở rộng TextWriter bằng chính bản ghi của bạn ở bất kỳ nơi nào bạn muốn.

Lưu ý: Tôi chưa thử nghiệm điều này.

public class ListBoxWriter : TextWriter 
{ 
    private ListBox list; 
    private StringBuilder content = new StringBuilder(); 

    public ListBoxWriter(ListBox list) 
    { 
     this.list = list; 
    } 

    public override void Write(char value) 
    { 
     base.Write(value); 
     content.Append(value); 
     if (value == '\n') 
     { 
      list.Items.Add(content.ToString()); 
      content = new StringBuilder(); 
     } 
    } 

    public override Encoding Encoding 
    { 
     get { return System.Text.Encoding.UTF8; } 
    } 
} 
+0

điều này thực hiện chính xác những gì im sau: D Cảm ơn – Fusspawn

3

Thay vì cố gắng "chụp" văn bản được gửi tới bảng điều khiển, tôi sẽ tạo một lớp mới xử lý việc viết đầu ra cho bạn. Sau đó, lớp học mới có thể ghi vào bảng điều khiển, cũng như bất kỳ nơi nào khác bạn muốn nó đi.

Nếu bạn đang sử dụng lớp gỡ lỗi của .NET, chỉ cần sử dụng hai trình nghe: một ConsoleTraceListener và một TextWriterTraceListener.

Để làm cho công việc mã hiện tại của bạn, thêm:

writer.Flush(); 

sau Console.WriteLine của bạn() gọi.

+0

nếu tôi không thể tìm thấy giải pháp cho điều này, tôi rất có thể sẽ làm theo cách đó. nhưng tôi thực sự muốn làm điều đó thông qua truy cập vào giao diện điều khiển ra, (Chủ yếu là một điều dễ sử dụng,) mà còn là một phần giáo dục. một cái gì đó của nó tôi chắc chắn tôi có thể tìm thấy nhiều sử dụng cho trong tương lai để học cách làm điều này bây giờ sẽ khá tiện dụng. – Fusspawn

+0

trong khi tôi không sử dụng lớp gỡ lỗi (không phải tất cả thông tin gỡ lỗi). Tôi đã quên mất sự tồn tại của lớp Debug đó mà tôi chỉ có thể chuyển đổi các bit để sử dụng nó. – Fusspawn

+0

Ok. Trong trường hợp đó để mã của bạn hoạt động, chỉ cần thêm: writer.Flush(); sau các cuộc gọi Console.WriteLine() của bạn. –

Các vấn đề liên quan