2010-03-19 33 views
9

tôi gặp sự cố lạ ... Tôi đã ngừng hoạt động trong vài giờ qua ... bộ tính giờ tôi đặt trong mã winform (từ thanh công cụ) sẽ không đánh dấu ...C# hẹn giờ sẽ không đánh dấu

Tôi có bộ hẹn giờ trên một vài biểu mẫu trong chương trình của mình, tất cả đều hoạt động tốt ... Tôi cố gắng thực hiện chính xác nó sẽ không đánh dấu ... Tôi chọn nó, kéo nó vào một hình thức, kích hoạt nó, thiết lập khoảng thời gian và xử lý các sự kiện đánh dấu ... và không có gì xảy ra ... tôi thậm chí đã thử đặt mã ngẫu nhiên như messagebox.show trong sự kiện đánh dấu chỉ để xem nếu có gì xảy ra, và không có gì !!! như tôi đã nói, có một vài bộ đếm thời gian hơn trong chương trình của tôi (trên các hình thức khác, không phải trong tôi đang cố gắng đặt bộ hẹn giờ này) và tất cả đều hoạt động tốt ...

bất kỳ đề xuất nào?

cảm ơn trước!

+2

một số mã sẽ giúp đỡ. – Shoban

+0

là mã tạo phòng thu trực quan tiêu chuẩn cho bộ hẹn giờ ... this.timer1 = new System.Windows.Forms.Timer (this.components); riêng System.Windows.Forms.Timer timer1; this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick + = new System.EventHandler (this.timer1_Tick_1); void riêng timer1_Tick_1 (đối tượng người gửi, EventArgs e) { MessageBox.Show ("TIMER TICKS"); } – Andrej

+0

Bạn đã bắt đầu chưa? – Jake

Trả lời

6

Hãy chắc chắn rằng bạn bắt đầu nó bằng cách gọi timer1.Start()

+1

+1 Tôi thấy rằng rất nhiều người không làm điều này :) –

+1

Vâng, tôi đã bị cắn bởi bản thân mình một vài lần –

+2

.Enabled = true là đủ. –

7

không System.Windows.Forms.Timer hẹn giờ bắt đầu vào .enabled ... anyway .. tôi đã chỉ có nó để làm việc ... tôi sao chép các visual studio generadted WINFORMNAME.designer.cs dạng mã để WINFORMNAME.cs ... tôi không biết làm thế nào và tại sao nhưng nó làm việc ...

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
timer.Enabled = true; 
timer.Interval = 1000; 
timer.Tick += new EventHandler(timer_Tick); 
     void timer_Tick(object sender, EventArgs e) 
     { 
//do something 
     } 

nhờ mọi người cho câu trả lời!

9

Tôi nhận thấy rằng nếu tôi ngừng bộ hẹn giờ từ một chuỗi không phải là giao diện người dùng, sau đó khởi động lại nó, tôi sẽ mất móc sự kiện.

Tôi không biết câu trả lời "đúng" là, nhưng điều này đã làm việc khá tốt cho tôi:

public class BetterTimer : System.Windows.Forms.Timer 
{ 
    public BetterTimer():base()   
    { base.Enabled = true; } 

    public BetterTimer(System.ComponentModel.IContainer container) : base(container) 
    { base.Enabled = true; } 

    private bool _Enabled; 
    public override bool Enabled 
    { 
     get { return _Enabled; } 
     set { _Enabled = value; } 
    } 

    protected override void OnTick(System.EventArgs e) 
    { if (this.Enabled) base.OnTick(e); } 
} 

Ba điều cần cách tiếp cận này:

1) Bằng cách ghi đè các nhà thầu, tôi đảm bảo rằng bộ đếm thời gian cơ sở được bật từ đầu.

2) Bằng cách ghi đè "Đã bật", tôi không bao giờ để bộ hẹn giờ cơ sở bị vô hiệu hóa, nhưng giao diện không thay đổi.

3) Bằng cách ghi đè "OnTick", tôi cho phép thuộc tính Bật được ghi đè quyết định xem sự kiện có nên kích hoạt hay không.

Bắt đầu() và Dừng() hoạt động bằng cách đặt đúng và sai cho thuộc tính Đã bật tương ứng.

BTW - không ai biết tại sao sự kiện không bao giờ kích hoạt (hoặc bị ngắt kết nối?) Khi bộ hẹn giờ bị dừng/vô hiệu hóa khỏi chuỗi không phải là giao diện người dùng?

+1

Điều này giải quyết nó cho tôi. Luôn luôn dừng/khởi động System.Windows.Forms.Timer trên thread UI, rõ ràng! – user1454265

+0

Đó là một câu trả lời rất hữu ích. Cảm ơn bạn rất nhiều ! :) –

2

Để trả lời câu hỏi cuối cùng của bạn, nó không được phép thao tác các điều khiển được tạo trên một chuỗi khác. Bạn có thể gọi thông qua các đại biểu.

+0

Trong một vấn đề chưa được giải quyết, mặc dù đã được giải quyết, tôi không chắc tại sao các cuộc gọi .Show() hoặc .ShowDialog() của tôi không hoạt động. Tôi đã thực hiện cuộc gọi xuyên suốt. Tuyên bố này đã giúp tôi tìm ra nó. Cảm ơn. –

1

Tôi đã gặp phải điều này trước đây. Tôi đã bật hẹn giờ trước khi đặt khoảng thời gian. Trao đổi hai dòng xung quanh làm cho nó hoạt động.

0

Tôi gặp vấn đề tương tự như Andrej và tôi đã thử một số giải pháp tôi tìm thấy trên web.

Tôi có thời gian giới hạn cho mỗi hình thức trong chương trình của tôi (đếm ngược) và đây là cách tôi giải quyết nó:

tôi đã sử dụng giải pháp kỹ thuật máy tính. tắt và bật lại !! :)) Tôi có nghĩa là tôi không biết tại sao nhưng nó hoạt động !!

trước hết tôi đã xóa tất cả các bộ hẹn giờ khỏi .cs và thiết kế sau đó tôi thêm bộ hẹn giờ vào mỗi biểu mẫu và đặt tên khác cho bộ đếm thời gian và hộp văn bản và viết cùng một mã.

tôi chỉ sử dụng timer.start() và Timer.stop()

private void Form7_Load_1(object sender, EventArgs e) 
    { 
     timer7.Start(); 
    } 

    int duration = 30; 

    private void timer7_Tick(object sender, EventArgs e) 
    { 
     duration--; 
     textBox7.Text = duration.ToString(); // to show the countdown 

     if (duration == 0) 
     { 
      timer7.Stop(); 
      MessageBox.Show("You ran out of time. Please go to the next page"); 

      this.Hide(); 
      Form8 f8 = new Form8(); 
      f8.ShowDialog(); 
     } 
    } 

hy vọng nó sẽ giúp