【问题标题】:Passing variable (time) from one form to another C#将变量(时间)从一种形式传递到另一种 C#
【发布时间】:2013-08-19 10:09:13
【问题描述】:

假设我有两种形式。第一个将包含开始按钮,另一个是停止按钮。有没有一种方法可以确定按下开始和停止按钮之间经过的时间并以第二种形式显示。

我尝试这样做并得到这些代码

形式一:开始按钮

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 显示错误的经过时间值。有什么建议可以让我的代码正常工作吗?谢谢!

【问题讨论】:

    标签: c# forms elapsedtime


    【解决方案1】:

    将开始时间传递给第二个表单

    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();
        }     
    }
    

    【讨论】:

    • 现在我明白了。我没有传递变量,这就是它不起作用的原因。试过了,它奏效了!谢谢您的帮助! :)
    【解决方案2】:

    根据这些表单是否存在于同一个应用程序中,您可以将对第一个表单的引用传递给第二个表单。然后(因为starttime1DateTime对象是公开的,你可以从第二种形式访问它。

    【讨论】:

    • 是的!我只是意识到我没有传递变量,这就是它不起作用的原因。感谢您的建议:)
    【解决方案3】:

    如果将数据存储在可以从两种形式访问的地方,它会更干净,更易于维护。例如一个静态类。 (您也可以使用数据库或文本文件)

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

    From1 中设置StartTime 并读回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 类。

    【讨论】:

    • 不错的建议。下次我会考虑做。谢谢!
    【解决方案4】:

    有多种解决方案,但也取决于您想要实现的目标的复杂性。 对代码进行较少修改的最简单的方法是在第二个表单上声明一个构造函数,该构造函数接受 DateTime 类型的参数,并在创建 Form2 时从 Form1 传入 startTime2,就像 Form2 form2 = new Form2(startTime2) 一样。 一种更优雅的方法是使用 GetElapsedTime() 方法定义一个接口,并创建一个处理开始/结束时间的具体实例,您可以像以前一样从 Form1 将具体实例传递给 Form2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多