2016-07-16 167 views
-2

Timer类的WinForms有一个叫做财产,Interval转换分钟到毫秒

获取或设置时间,以毫秒为单位,前Tick事件相调至Tick事件的最后一次出现。

在我的表单上我有一个文本框,用户可以在几分钟内输入他们想要设置计时器的时间。

但是我无法用我所做的功能分钟转换成毫秒:

public static double ConvertMinutesToMilliseconds(double minutes) 
{ 
    return TimeSpan.FromMinutes(minutes).TotalMilliseconds; 
} 

我的代码如下所示:

if (result1 == DialogResult.Yes) 
{ 
    Timer tm; 
    tm = new Timer(); 

    tm.Interval = int.Parse(textBox2.Text); 
    tm.Interval = ConvertMinutesToMilliseconds(tm.Interval); 
    tm.Tick += new EventHandler(button1_Click); 

    string pastebuffer = DateTime.Now.ToString(); 
    pastebuffer = "### Edited on " + pastebuffer + " by " + txtUsername.Text + " ###"; 
    Clipboard.SetText(pastebuffer); 

    tm.Start(); 
} 

我的错误是:无法隐式转换类型'双'到'int'。一个显式转换存在(是否缺少强制转换?)

+0

你的方法''ConvertMinutesToMilliseconds ''签名表示在将''int''传递给它时需要''double'' –

+2

更改public static double ConvertMinutesToMillisecon ds(double minutes)''to public static double ConvertMinutesToMilliseconds(int minutes)'' –

+0

tm.Interval =(int)ConvertMinutesToMilliseconds(tm.Interval); – 2016-07-16 08:19:28

回答

3

System.Windows.Forms.Timer.Intervalint类型 - 这是稍显混乱,因为System.Timers.Timer.Intervaldouble类型。所以你试图将你的方法的结果(一个double)分配给int类型的属性。这是行不通的。你当然可以投:

timer.Interval = (int) ConvertMinutesToMilliseconds(...); 

但是,我想借此机会重构你的代码。最初,您将分钟值分配到timer.Interval,这在单位方面根本就是错误的。你只是把它当做一个临时变量,有效的 - 所以作出这样的清晰,并尝试使用“分配在声明的点”为清楚起见太:

if (result1 == DialogResult.Yes) 
{ 
    // TODO: Use int.TryParse to handle invalid input 
    int minutes = int.Parse(textBox2.Text); 
    Timer timer = new Timer 
    { 
     // I don't actually think it's worth having a method for this... 
     Interval = (int) TimeSpan.FromMinutes(minutes).TotalMilliseconds 
    } 
    // Use method group conversion instead of new EventHandler(...) 
    // TODO: Rename button1_Click to a name which says what it actually does 
    timer.Tick += button1_Click; 

    // Interpolated strings make life simpler 
    Clipboard.SetText($"### Edited on {DateTime.Now} by {txtUsername.Text} ###"); 

    timer.Start(); 
} 

然后你只需要担心(如果我没记错正确)保持对定时器实例的引用,使其不会被垃圾收集。所以你可能需要某种“活动定时器列表”。我可能误解了这一点,但是您可能仍想保留该列表,以便在适当的时候停止所有活动计时器。

2

你的函数接受double,但你输入一个int(这种转换可以隐发生),那么你正在改变这个时间为毫秒(可能是一个int为好),并返回它作为一个double。然后你将这个双分配给一个int(tm.Interval)。

这最后一次转换不能隐式发生(这意味着编译器不会为你做),因为你正在将可以表示分数的类型(double)转换为不能(int)的类型,所以信息可能会迷路了。

为了解决这个问题,你可以行

tm.Interval = ConvertMinutesToMilliseconds(tm.Interval); 

改变

tm.Interval = (int) ConvertMinutesToMilliseconds(tm.Interval); 

,或者更方便,线路

public static double ConvertMinutesToMilliseconds(double minutes) 

public static int ConvertMinutesToMilliseconds(int minutes) 

因为它没有什么复杂的,你可能还需要使用

minutes*60000 

,而不是

TimeSpan.FromMinutes(minutes).TotalMilliseconds. 
+0

'TimeSpan.FromMinutes(分钟).TotalMillisecond'比'minutes/60000'更可读,更清晰。至少应该声明一个常量“MillisecondsPerMinute”,而不是用一些幻数除数。 – tearvisus

+0

@tearvisus哦,来吧,你真的说'int milliseconds = minutes * 60000;'比'int minute = TimeSpan.FromMinutes(minutes).TotalMilliseconds'更不可读。有一些情况下,直接使用数字是可以的,每天的小时数,每周的数天和每分钟的数秒就是例子。 –

+0

@MthetheWWatson - 取决于变量名称,我可以每小时每天,每周几天和每分钟秒数。但60000?对于毫秒,3600000会好几个小时?在我看来,零点运行并不容易。 – dbasnett

0

,你去将是方便的方法:

public static int ConvertMinutesToMilliseconds(int minutes) 
{ 
    return (int) TimeSpan.FromMinutes(minutes).TotalMilliseconds; 
}