2012-01-10 14 views
1

мне нужна разность двух DateTime вплоть до сравнения миллисекунды первый DateTime собирается быть меньше, чем второй, его остановить цикл в GridViews удалить событиеDateTime Разница во времени и миллисекунды

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    if (!Ok2Delete(e.RowIndex)) return;  

    // your logic goes here and the above IF statement 
    // will hopefully guarantee your code to run once. 
} 
private bool Ok2Delete(int ri) // ri is the record index to be deleted 
{ 
    if (Session["ri"] == null || 
     (!((ri == ((int)Session["ri"])) && 
     (DateTime.Now.Subtract((DateTime)Session["ri_time_stamp"]).Seconds < 2)))) 
    { 
     Session["ri"] = ri; 
     Session["ri_time_stamp"] = DateTime.Now; 
     return true; 
    } 
    return false; 
} 

этот код не работает, как ожидалось

+0

Ваш код ищет более чем 2-секундную разницу в функции OK2Delete. Что именно вы ищете вместо этого? Более 0 миллисекунд? –

+1

Также используйте DateTime.UtcNow вместо DateTime.Now. Это делает ваше приложение независимым от машины и TimeZone. –

+0

Ну, все приложили усилия, поэтому мне нужно выбрать ответ, но он не совсем работает. – ONYX

ответ

2

Использовать .TotalSeconds ... иначе TimeSpan из 122 TotalSeconds будет составлять 2 секунды.

private bool Ok2Delete(int ri) // ri is the record index to be deleted 
{ 
    if (Session["ri"] == null || 
     (!((ri == ((int)Session["ri"])) && 
     (DateTime.Now.Subtract((DateTime)Session["ri_time_stamp"]).TotalSeconds < 2)))) 
    { 
     Session["ri"] = ri; 
     Session["ri_time_stamp"] = DateTime.Now; 
     return true; 
    } 
    return false; 
} 
+0

Вы должны использовать «TotalMilliseconds», поскольку время, требуемое для запроса, равняется миллисекунде. – Sprunth

+0

@Sprunth, я думаю, что OP означает, что сравнение будет «точным» на миллисекунду, а не на сравниваемом значении ... оно будет даже более точным, чем миллисекунды. –

+0

Это код на форумах asp.net, посвященных проблеме удаления события, дважды срабатывающего – ONYX

1

Вы хотите что-то вроде этого (с помощью TotalMilliseconds на TimeSpan, что является результатом вычитания двух объектов DateTime):

DateTime dt1 = DateTime.Now; 
DateTime dt2 = DateTime.Now; 

Console.WriteLine(dt2.Subtract(dt1).TotalMilliseconds.ToString()); 

Для конкретного сценария:

DateTime.Now.Subtract((DateTime)Session["ri_time_stamp"]).TotalMilliseconds < 500 

Update

На основе замечаний и обзор кода, проблема не связана с разницей во времени. Вместо этого проблема заключается в коде RowDeleting. Следующая строка:

if (!Ok2Delete(e.RowIndex)) return; 

должен быть изменен на

if (!Ok2Delete(e.RowIndex)) { 
    e.Cancel = true; 
    return; 
} 
+0

@ KDM: Сделал и просто обновил ответ, чтобы отразить это. –

+0

Я думаю, что вашей логике может понадобиться какая-то настройка. Сейчас ваша логика: если в сеансе не было предыдущего ri (тот же ri не находится в сеансе OR (тот же ri находится в сеансе И прошедшее время <2 секунды)). Это логика, за которой вы после? –

+0

Это код на форумах asp.net, посвященных проблеме удаления события дважды. – ONYX

1

(end - start).TotalMilliseconds, где начальная и конечная DateTime

Имейте в виду, что вы не можете быть в состоянии получить точность миллисекунды из DateTime. Теперь(). См. this question. Вы можете использовать Stopwatch, если вам нужна более точная точность.

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