2013-08-19 2 views
0

Предположим, у меня две формы. Первая будет содержать кнопку запуска, а другая - кнопку остановки. Есть ли способ, по которому я могу определить прошедшее время между нажатием кнопки «Пуск» и «Стоп» и показать его во 2-й форме.Передача переменной (времени) из одной формы в другую C#

Я попытался сделать это и прийти к этим кодам

Форма 1: Кнопка запуска

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    public DateTime startTime2; 
    public DateTime endTime; 
    public TimeSpan ts_timeElapsed; 
    public string s_timeElapsed; 


    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void StartButton_Click(object sender, EventArgs e) 
    { 
     startTime2 = DateTime.Now; 
     Form2 frm = new Form2(); 
     frm.Show(); 
     this.Hide(); 


    } 

    private void Button2_Click(object sender, EventArgs e) 
    { 
     Instructions frm = new Instructions(); 
     frm.Show(); 
     this.Hide(); 

    } 


} 
} 

Форма 2: Стоп кнопка

namespace WindowsFormsApplication1 
{ 
public partial class RoadSign1Meaning : Form 
{ 
    public DateTime startTime1; 
    public DateTime endTime; 
    public TimeSpan ts_timeElapsed; 
    public string s_timeElapsed; 

    public RoadSign1Meaning() 
    { 
     InitializeComponent(); 
    } 
    public string GetElapsedTimeString() 
    { 
     int days = ts_timeElapsed.Days; 
     int hours = ts_timeElapsed.Hours; 
     int mins = ts_timeElapsed.Minutes; 
     int secs = ts_timeElapsed.Seconds; 
     string x = ""; 
     if (days != 0) 
     { 
      x += days.ToString() + ":"; 
     } 
     if (hours != 0) 
     { 
      x += hours.ToString() + ":"; 
     } 
     if (mins != 0) 
     { 
      x += mins.ToString() + ":"; 
     } 
     if (secs != 0) 
     { 
      x += secs.ToString(); 
     } 

     return x; 
    } 

    private void StopButton_Click(object sender, EventArgs e) 
    { 
        endTime = DateTime.Now; 
     ts_timeElapsed = (endTime - startTime1); 
     s_timeElapsed = GetElapsedTimeString(); 
     ElapsedLabel.Text = "Time Elapsed: " + s_timeElapsed; 

     Form3 frm = new Form3(); 
     frm.Show(); 
    } 
} 
} 

Однако проблема значение времени из форма 1 не сохраняется, поэтому в форме 2 отображается неправильное значение прошедшего времени. Любые предложения, чтобы мой код работал? Благодаря!

ответ

0

Было бы проще и удобнее обслуживать, если вы храните данные в месте, доступном из обеих форм. Например, статический класс. (Вы также можете использовать файл базы данных или текста)

public static TempStore 
{ 
    public DateTime StartTime { get; set; } 
} 

Набор StartTime из From1 и считаны разницу в Form2

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void StartButton_Click(object sender, EventArgs e) 
    { 
     TempStore.StartTime = DateTime.Now; 

     // ... 
    } 
} 

Форма 2:

public partial class RoadSign1Meaning : Form 
{ 
    public RoadSign1Meaning() 
    { 
     InitializeComponent(); 
    } 

    private void StopButton_Click(object sender, EventArgs e) 
    { 
     TimeSpan span = DateTime.Now - TempStore.StartTime;    

     // ... 
    } 
} 

Таким образом, если вы решили передать больше данных в формы и из них, вы можете расширить этот класс static.

+0

Отличное предложение. Я подумаю об этом в следующий раз. Благодаря! – kilua

1

В зависимости от того, существуют ли эти формы в одном приложении, вы можете передать ссылку на первую форму во вторую. А потом (так как starttime1DateTime объект является открытым, вы можете получить доступ к нему из второй формы.

+0

Yup! Я просто понимаю, что я не прошел переменную, поэтому она не сработала. Спасибо за совет :) – kilua

5

Пасс время начала второй формы

private void StartButton_Click(object sender, EventArgs e) 
{ 
    Form2 frm = new Form2(DateTime.Now); 
    frm.Show(); 
    this.Hide(); 
} 

И затем использовать его

public partial class Form2 : Form 
{ 
    private DateTime startTime; 

    public Form2(DateTime startTime) 
    { 
     InitializeComponent(); 
     this.startTime = startTime; 
    } 

    private void StopButton_Click(object sender, EventArgs e) 
    { 
     endTime = DateTime.Now; 
     ts_timeElapsed = (endTime - startTime); 
     s_timeElapsed = GetElapsedTimeString(); 
     ElapsedLabel.Text = "Time Elapsed: " + s_timeElapsed; 

     Form3 frm = new Form3(); 
     frm.Show(); 
    }  
} 
+1

Теперь я понял. Я не передал переменную, поэтому она не работает. Пробовал это, и это сработало! Спасибо за помощь! :) – kilua

0

Есть несколько решений, но также зависит от сложности того, чего бы вы хотели достичь. Простейший вариант с меньшими изменениями в коде будет объявлять конструктор на вашей второй форме, которая принимает параметр r типа DateTime и передать в startTime2 из Form1 при создании Form2 так же, как Form2 form2 = new Form2 (startTime2). Более элегантным способом было бы определить интерфейс с помощью метода GetElapsedTime() и создать конкретный объект, в котором позаботится время начала и окончания, и вы можете передать конкретный экземпляр Form2, как раньше, из Form1.

Смежные вопросы