Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Cách làm cho label thay đổi text liên tục trong C#?

  1. #1
    Ngày gia nhập
    01 2010
    Bài viết
    18

    Mặc định Cách làm cho label thay đổi text liên tục trong C#?

    Form mình tạo chỉ có duy nhất 1 label, và trong sự kiện load form mình viết:
    Code:
    while (true)
    {
    Random r = new Random();
    label1.Text=r.Next().ToString();
    }
    Mà sao mỗi khi chạy là form bị treo, cho mình hỏi tại sao như vậy và cách nào để label thay đổi text liên tục trong quá trình chạy ? (điều kiện là không dùng timer).

  2. #2
    Ngày gia nhập
    04 2011
    Bài viết
    24

    theo mình nghĩ bạn nên để đoạn code đó vào trong sự kiện click của bottom khi form đã load hoàn toàn bạn hãy bấm button thử xem.

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    125

    bó tay while(true) nó chạy tới khi nào mà hỏi sao form nó ko bị treo @@

  4. #4
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    tạo một timer trong form,
    click đúp vào timer rồi paste code trong vòng lặp vào.
    Nhớ là phải enable timer trước khi chạy.

  5. #5
    Ngày gia nhập
    02 2011
    Nơi ở
    Bảo Lộc, Vietnam
    Bài viết
    68

    điều kiện là ko dùng Timer, cái này có thể dùng DateTime để canh thời gian đổi text.

  6. #6
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định Cách làm cho label thay đổi text liên tục trong C#?

    oh, sorry,

    bạn thêm
    Visual C# Code:
    1. using System.Threading;

    rồi paste đè lên Form load như sau:


    Visual C# Code:
    1.         private void GO()
    2.         {
    3.             while (true)
    4.             {
    5.                 Random r = new Random();
    6.                 label1.Text = r.Next().ToString();
    7.             }
    8.         }
    9.  
    10.  
    11.         private void Form1_Load(object sender, EventArgs e)
    12.         {
    13.             Control.CheckForIllegalCrossThreadCalls = false;
    14.             Thread ct = new Thread(GO);
    15.             ct.Start();
    16.         }

  7. #7
    Ngày gia nhập
    01 2010
    Bài viết
    18

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    oh, sorry,

    bạn thêm
    Visual C# Code:
    1. using System.Threading;

    rồi paste đè lên Form load như sau:


    Visual C# Code:
    1.         private void GO()
    2.         {
    3.             while (true)
    4.             {
    5.                 Random r = new Random();
    6.                 label1.Text = r.Next().ToString();
    7.             }
    8.         }
    9.  
    10.  
    11.         private void Form1_Load(object sender, EventArgs e)
    12.         {
    13.             Control.CheckForIllegalCrossThreadCalls = false;
    14.             Thread ct = new Thread(GO);
    15.             ct.Start();
    16.         }
    Bạn viết rất đúng ý mình. Lúc trước mình viết không có câu Control.CheckForIllegalCrossThreadCalls = false; nên nó báo lỗi, cho hỏi là câu đó dùng để làm gì vậy.
    Thềm nữa là code bạn viết có lỗi phát sinhi khi đóng form:
    Code:
    System.ObjectDisposedException was unhandled
      Message="Cannot access a disposed object.\r\nObject name: 'Label'."
      Source="System.Windows.Forms"
      ObjectName="Label"
      StackTrace:
           at System.Windows.Forms.Control.CreateHandle()
           at System.Windows.Forms.Control.get_Handle()
           at System.Windows.Forms.Control.get_WindowText()
           at System.Windows.Forms.Control.get_Text()
           at System.Windows.Forms.Label.get_Text()
           at System.Windows.Forms.Control.set_Text(String value)
           at System.Windows.Forms.Label.set_Text(String value)
           at test2.Form1.GO() in E:\My Documents\Visual Studio 2008\Projects\test2\test2\Form1.cs:line 25
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()

  8. #8
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    về CheckForIllegalCrossThreadCalls, theo msdn:
    khi truy cập control từ một thread khác, debugger sẽ bắt lỗi này. đặt CheckForIllegalCrossThreadCalls để debugger ko bắt lỗi đó.

    bạn sửa lại code cho chắc ăn:
    Code:
    private void GO()
            {
                while (true)
                {
                    Random r = new Random();
                    label1.Text = r.Next().ToString();
                }
            }
    
            Thread ct;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;
                ct = new Thread(GO);
                ct.Start();
            }
    
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                ct.Abort();
            }
    c# nó làm chặt quá, mình dùng quen C++ chỉ tạo thread mới là xong.

  9. #9
    Ngày gia nhập
    10 2010
    Bài viết
    177

    Cậu có thể dùng Timer. Set thời gian cho nó sau khoảng thời gian thì cho nó thực thi việc thay đổi giá trị.

  10. #10
    Ngày gia nhập
    02 2010
    Bài viết
    52

    private void GO()
    {
    while (true)
    {
    Random r = new Random();
    setlbl(r.Next().ToString());
    }
    }

    Thread ct;

    private void Form1_Load(object sender, EventArgs e)
    {
    Control.CheckForIllegalCrossThreadCalls = false;
    ct = new Thread(GO);
    ct.Start();
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
    ct.Abort();
    }

    delegate void delegate_setlbl(string str);

    private void setlbl(string str)
    {
    if (this.label1.InvokeRequired)
    this.label1.Invoke(new delegate_setlbl(setlbl), str);
    else
    this.label1.Text = str;
    }


    ghi như trên là chính xác nhất khỏi cần đặt CheckForIllegalCrossThreadCalls, tuy hơi dài dòng chút nhưng cách viết trên mới đúng (mình được 1 pro hướng dẫn cách làm này)
    vì đặt CheckForIllegalCrossThreadCalls chỉ dấu ko báo lỗi đó thôi, nhưng nếu gặp trường hợp cùng một thời điểm 2 thread cùng sử dụng 1 control thì sẽ phát sinh lỗi
    Email : leminhphuoc89@gmail.com

Các đề tài tương tự

  1. Tạo vòng lặp để thay đổi text trên Label
    Gửi bởi vltd trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 29-04-2013, 12:47 PM
  2. ADO.NET Cách xuống dòng tự động trong label.text?
    Gửi bởi hung_3805 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 08-09-2012, 08:32 PM
  3. Thay thế header Text được load từ field trong db bằng text theo ý muốn ?
    Gửi bởi toanzoom trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 17-05-2012, 09:38 PM
  4. Algorithm Sử dụng hook in C# để thay đổi text của label?
    Gửi bởi sona9qt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 14
    Bài viết cuối: 06-08-2011, 11:33 PM
  5. Lấy giá trị của label(label.Text) trong datalist
    Gửi bởi nhatnghe_thuong trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 7
    Bài viết cuối: 16-02-2011, 04:48 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn