2016-07-16 10 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(); 
} 

Моя ошибка: Не удается неявно преобразовать тип " double 'to' int '. Явное преобразование существует (вы пропали без вести бросок?)

+0

ваш метод '' ConvertMinutesToMilliseconds '' подпись говорит, что он принимает '' double'' в качестве параметра, пока вы передаете '' int'' ' –

+2

изменить '' public static double ConvertMinutesToMillisecon ds (double minutes) '' to '' public static double ConvertMinutesToMilliseconds (int minutes) '' –

+0

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

ответ

3

System.Windows.Forms.Timer.Interval имеет тип int - это немного сбивает с толку, потому что System.Timers.Timer.Interval имеет тип double. Поэтому вы пытаетесь присвоить результат своего метода (a 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 (минуты) .TotalMilliseconds' является более читаемым и понятным, чем' minutes/60000'. По крайней мере, нужно объявить константу 'MillisecondsPerMinute', а не делить на магическое число. – tearvisus

+0

@tearvisus О, да, вы действительно говорите, что 'int milliseconds = minutes * 60000;' менее читается, чем 'int minutes = TimeSpan.FromMinutes (minutes) .TotalMilliseconds'. Есть несколько случаев, когда прямое использование номеров в порядке, а примерами являются часы в день, дни в неделю и секунды в минуту. –

+0

@MatthewWatson - в зависимости от имен переменных Я в порядке с часами в день, день в неделю и секунды в минуту. Но 60000? Будет ли 3600000 в порядке от часов до ms.? По моему мнению, прогоны нулей нелегко читать. – dbasnett

0

удобный способ для вас, чтобы пойти бы:

public static int ConvertMinutesToMilliseconds(int minutes) 
{ 
    return (int) TimeSpan.FromMinutes(minutes).TotalMilliseconds; 
} 
Смежные вопросы