2017-10-07 186 views
0

我一直试图做一个简单的秒到小时和分钟转换器只是为了练习一些C#。奇怪的是,当我通过599秒标记时,程序减去60秒。所以,540秒等于9分钟; 599秒等于9分59秒,但600秒等于9分钟。我试着用一个按钮来触发命令而不是textchanged,并且按钮做得很好。所以,我认为,问题的根源必须是textchanged事件本身。我将增加三个例子。截图图像是土耳其语,但你会很容易明白。Textchanged事件将无法正确计算

我该如何解决这个问题,以及导致这个问题的原因是什么?这真的让人难以置信。这应该被减去secondLeft值

second = second - minuteLeft; 

Screenshot

int second, minute, hour, minuteLeft, secondLeft; 

    private void txtTime_TextChanged(object sender, EventArgs e) 
    { 
     CalculateTime(); 

    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    void CalculateTime() 
    { 
     if (txtTime.Text != "") 
     { 

      second = Convert.ToInt32(txtSure.Text); 
      secondLeft = second % 60; 
      second = second - minuteLeft; 

      minute = second/60; 
      minuteLeft = minute % 60; 
      minute = minute - minuteLeft; 

      hour = minute/60; 


      lblMsg.Text = hour.ToString() + " hours, " + minuteLeft.ToString() + " minutes " + secondLeft.ToString() + " seconds."; 
     } 
     else 
     { 
      lblMsg.Text = ""; 
     } 
+0

我强烈建议删除这条线'int second,minute,hour,minuteLeft,secondLeft;',然后根据需要在'CalculateTime'中声明变量。 _不需要'second''等字段._ – mjwills

+0

@mjwills嗨,感谢您的反馈。这样做的好处是什么?为了使代码更清洁? –

+0

是的,使它更清洁。而且,编译器会立即向您显示错误。 'var second = Convert.ToInt32(txtSure.Text); var secondLeft = second%60; second = second - minuteLeft; var minute = second/60; var minuteLeft = minute%60; 分钟=分钟 - 分钟左边; var hour = minute/60;''不会编译 - 因为你的bug。这很好 - 编译器(而不是stackoverflow)为你做了很多努力! – mjwills

回答

0

您是从秒数中减去minuteLeft

second = second - secondLeft; 
+0

我不相信我错过了它。谢谢!尽管如此,我怎样才能使它完美的按钮?代码完全一样。 –

0

你可以考虑进攻问题以不同的方式:

var durationInSeconds = Convert.ToInt32(txtTime.Text); 
var duration = new TimeSpan(0, 0, durationInSeconds); 

var second = duration.Seconds; 
var minute = duration.Minutes; 
var hour = Convert.ToInt32(Math.Truncate(duration.TotalHours)); 

TimeSpan非常适合于这个类的问题,并且将允许你“自动”提取的持续时间的小时,分​​钟和第二组分。

你也可以考虑更换:

hour.ToString() + " hours, " + minuteLeft.ToString() + " minutes " + secondLeft.ToString() + " seconds."; 

有一个呼叫:从https://codereview.stackexchange.com/questions/24995/convert-timespan-to-readable-text

public static string ToPrettyFormat(TimeSpan timeSpan) 
{ 
    var dayParts = new[] { GetDays(timeSpan), GetHours(timeSpan), GetMinutes(timeSpan) } 
     .Where(s => !string.IsNullOrEmpty(s)) 
     .ToArray(); 

    var numberOfParts = dayParts.Length; 

    string result; 
    if (numberOfParts < 2) 
     result = dayParts.FirstOrDefault() ?? string.Empty; 
    else 
     result = string.Join(", ", dayParts, 0, numberOfParts - 1) + " and " + dayParts[numberOfParts - 1]; 

    return result.UppercaseFirst(); 
} 

被盗。