2013-07-05 3 views
0

Я подключился к базе данных SQL Server и могу выполнять простые операции CRUD. Теперь я хочу, чтобы мое приложение показывало второй Form(напоминание), когда у меня в моей базе данных есть день рождения сегодня, но ничего не происходит, когда я запускаю свое приложение.Показать новую форму в событии таймера таймера

EDIT: Моя форма напоминания теперь показывает правильно, но когда я пытаюсь закрыть эту форму, я получаю сообщение об ошибке:

Не удается получить доступ к объекту, расположенный. Имя объекта: 'Form2'.

Вот мой код:

public partial class Form1 : Form 
{ 
    Timer timer = new Timer(); 
    Form2 forma = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
     var data = new BirthdayEntities(); 
     dataGridView1.DataSource = data.Tab_Bday.ToList(); 

     timer.Tick += new EventHandler(timer_Tick); 
     timer.Interval = (1000) * (1);    
     timer.Enabled = true;      
     timer.Start();        
    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 
     Boolean flag = false; 
     IQueryable<Tab_Bday> name; 

     using (var data2 = new BirthdayEntities()) 
     { 
      name = (from x in data2.Tab_Bday 
        select x); 

      foreach (var x in name) 
      { 
       if (x.Datum.Day == System.DateTime.Now.Day && x.Datum.Month == System.DateTime.Now.Month) 
       { 
        flag = true; 
        break; 
       } 
      } 
     } 

     if (flag == true) 
      forma.Show(); 
    } 
+0

Пожалуйста, покажите код, в котором вы установили таймер. – zimdanen

+0

Где вы создаете свой 'Таймер'? Можете ли вы показать код, который его устанавливает? – gwin003

+0

Я не понимаю, чего хочу от меня, чтобы показать вам, я просто сделал это в своей основной форме. Извините, я новичок и ничего не понимаю о 'timer' и о том, как его настроить ... :( –

ответ

0

Это настроить ваш Timer как вы должны.

public void TimerSetup() { 
    Timer timer1 = new Timer(); 
    timer1.Interval = 1000;  //timer will fire every second 
    timer1.Tick += OnTimedEvent; 
    timer1.Enabled = true; 
    timer1.Start(); 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); 
} 
+0

Где я должен помещать этот код? На моей основной форме «.cs» или? –

+0

О, мальчик, тебе нужно просто попробовать что-нибудь и посмотреть, что будет, Махир. Если вы хотите, чтобы таймер начал работать сразу, вызовите 'TimerSetup()' из вашего конструктора. –

+0

Я пробовал, но complier показывает мне это сообщение об ошибке: «System.Windows.Forms.Timer» не содержит определения для «Истекшее» и никакого метода расширения «Истек», принимающего первый аргумент типа «System.Windows.Forms». Timer 'можно найти (вы не указали директиву или ссылку на сборку?) \t C: \ Users \ Mensur i Mahir \ Documents \ Visual Studio 2012 \ Projects \ Marina \ Marina \ Form1.cs Marina –

0

Это должно сработать. Не забудьте запустить и остановить таймер.

Timer timer = new Timer(); 
    timer.Interval = 1000; // 1 second 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 

    private void timer_Tick(object sender, EventArgs e) { 
     Timer timer = (Timer)sender; 
     timer.Stop(); 
     new Form().ShowDialog(); 
    } 
+0

Спасибо. Это просто сообщение об ошибке, когда я пытаюсь закрыть форму напоминания. Все работает нормально ... –

+0

Попробуйте ShowDialog() вместо Show().Это сделает его модальным и остановит основную программу от продолжения до закрытия формы. Это может исправить ошибку, полученную вами, когда она попыталась избавиться от формы. – jiverson

+0

Почему бы просто не создать форму напоминания, если вы хотите ее отобразить? new Form2(). ShowDialog(); – jiverson

0

Если вы хотите показать свою форму напоминания без бросать такое исключение при ее закрытии, есть 2 подхода:

1. Create new Reminder form every time you want to show it. 
2. Add code to `FormClosing` event handler to Cancel the Closing operation and just hide it instead like this: 

    public Form1() 
    { 
    InitializeComponent(); 
    var data = new BirthdayEntities(); 
    dataGridView1.DataSource = data.Tab_Bday.ToList(); 
    //add this 
    forma.FormClosing += forma_FormClosing; 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Interval = (1000) * (1);      
    timer.Start();        
    } 
    private void forma_FormClosing(object sender, FormClosingEventArgs e){ 
    if(e.CloseReason == CloseReason.UserClosing){ 
     e.Cancel = true; 
     forma.Hide(); 
    } 
    } 
Смежные вопросы