2010-10-06 4 views
0

Привет всем, у меня есть следующий код, чтобы заполнить выпадающий список для совместного использования с каландерными компаниями 2008-2010 годов. Это выход:ASP.net dateADD help

2008 Period 1: 11/30/2008 - 12/27/2008 
2008 Period 2: 12/28/2008 - 1/24/2009 
2009 Period 3: 1/25/2009 - 2/21/2009 
2009 Period 4: 2/22/2009 - 3/21/2009 
2009 Period 5: 3/22/2009 - 4/18/2009 
2009 Period 6: 4/19/2009 - 5/16/2009 
2009 Period 7: 5/17/2009 - 6/13/2009 
2009 Period 8: 6/14/2009 - 7/11/2009 
2009 Period 9: 7/12/2009 - 8/8/2009 
2009 Period 10: 8/9/2009 - 9/5/2009 
2009 Period 11: 9/6/2009 - 10/3/2009 
2009 Period 12: 10/4/2009 - 10/31/2009 
2009 Period 13: 11/1/2009 - 11/28/2009 
2009 Period 1: 11/29/2009 - 12/26/2009 
2009 Period 2: 12/27/2009 - 1/23/2010 
2010 Period 3: 1/24/2010 - 2/20/2010 
2010 Period 4: 2/21/2010 - 3/20/2010 
2010 Period 5: 3/21/2010 - 4/17/2010 
2010 Period 6: 4/18/2010 - 5/15/2010 
2010 Period 7: 5/16/2010 - 6/12/2010 
2010 Period 8: 6/13/2010 - 7/10/2010 
2010 Period 9: 7/11/2010 - 8/7/2010 
2010 Period 10: 8/8/2010 - 9/4/2010 
2010 Period 11: 9/5/2010 - 10/2/2010 

и вот код для него:

Dim dt2009Start As DateTime 
    Dim dtTempStart, dtTempEnd As DateTime 
    Dim dtTempNow As DateTime 
    Dim nTemp As Integer 
    Dim itemPeriod As ListItem 
    Dim timesAround As Integer 

    dt2009Start = Convert.ToDateTime("11/30/2008") 
    dtTempStart = dt2009Start 
    dtTempEnd = dtTempStart.AddDays(27) 

    ddlInvoicePeriods.Items.Clear() 

    dtTempNow = DateTime.Now() 
    nTemp = 1 
    timesAround = 0 

    While (dtTempNow > dtTempEnd) 
     If nTemp = 12 Then 
      If timesAround = 0 Then 
       'dtTempStart = Convert.ToDateTime("10/25/2009") 
       'dtTempEnd = Convert.ToDateTime("11/18/2009") 
      End If 
     ElseIf nTemp = 14 Then 
      If timesAround = 0 Then 
       dtTempStart = Convert.ToDateTime("11/29/2009") 
       dtTempEnd = Convert.ToDateTime("12/26/2009") 
       nTemp = 1 
       timesAround += 1 
      End If 
     End If 

     itemPeriod = New ListItem() 
     itemPeriod.Text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString() 
     itemPeriod.Value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString() 
     ddlInvoicePeriods.Items.Add(itemPeriod) 
     itemPeriod = Nothing 

     Debug.Print(dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()) 

     dtTempStart = dtTempEnd.AddDays(1) 
     dtTempEnd = dtTempStart.AddDays(27) 
     nTemp += 1 
    End While 

    If nTemp = 12 Then 
     dtTempStart = Convert.ToDateTime("12/27/2009") 
     dtTempEnd = Convert.ToDateTime("11/18/2009") 
    ElseIf nTemp = 13 Then 
     dtTempStart = Convert.ToDateTime("11/19/2009") 
     dtTempEnd = Convert.ToDateTime("12/16/2009") 
    End If 

    itemPeriod = New ListItem 
    itemPeriod.Text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString() 
    itemPeriod.Value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString() 
    ddlInvoicePeriods.Items.Add(itemPeriod) 
    itemPeriod = Nothing 

Как вы уже заметили, вывод идет только к 2010 году (10/2/2010), который должен идти на все путь к 31.12.2011.

Проблема бытия:

Он должен начать так:

2008 Period 13: Nov 30 - Dec 27 
2009 Period 1: Dec 28 - Jan 24 
2009 Period 2: Jan 25 - Feb 21 
2009 Period 3: Feb 22 - Mar 21 
... 
2009 Period 13: Nov 29 - Dec 26 
2010 Period 1: Dec 27 - Jan 23 
2010 Period 2: Jan 24 - Feb 20 
.. 
2010 Period 13: Nov 28 - Dec 25 
2011 Period 1: Dec 26 - Jan 22 
2011 Period 2: Jan 23 - Feb 19 
...etc 

Любая помощь будет удивительным, как я нахожусь на моем конце, пытаясь понять, что я делаю неправильно! : О)

Дэвид

ответ

2

Существует много я хотел бы изменить (в то числе с использованием класса Иэн для представляющего периода), и признавая, что nTemp должен начаться в 13 для этого примера и список останавливается, потому что цикл был сказал, чтобы разорвать на DateTime.Now без видимой причины, Eventhough вы сказали, он должен продолжать работать до конца 2011 года Но вот как сделать код, который вы размещены работы:

Dim dt2009Start As DateTime 
    Dim dtTempStart, dtTempEnd As DateTime 
    Dim dtTempNow As DateTime 
    Dim nTemp As Integer 
    Dim itemPeriod As ListItem 
    Dim timesAround As Integer 
    Dim dtReallyEnd As DateTime 
    Dim year As Integer 

    year = 2008 
    dt2009Start = Convert.ToDateTime("11/30/2008") 
    dtTempStart = dt2009Start 
    dtTempEnd = dtTempStart.AddDays(27) 
    dtReallyEnd = Convert.ToDateTime("12/31/2011") 


    dtTempNow = DateTime.Now() 
    nTemp = 13 
    timesAround = 0 

    While (dtReallyEnd > dtTempEnd) 
     If nTemp = 14 Then 
      nTemp = 1 
      timesAround += 1 
      year += 1 
     End If 


     itemPeriod = New ListItem() 
     itemPeriod.text = year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString() 
     itemPeriod.value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString() 
     ddlInvoicePeriods.Items.Add(itemPeriod) 
     itemPeriod = Nothing 

     Debug.Print(dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()) 

     dtTempStart = dtTempEnd.AddDays(1) 
     dtTempEnd = dtTempStart.AddDays(27) 
     nTemp += 1 
    End While 

    If nTemp = 14 Then 
     nTemp = 1 
     timesAround += 1 
     year += 1 
    End If 

    itemPeriod = New ListItem 
    itemPeriod.text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString() 
    itemPeriod.value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString() 
    ddlInvoicePeriods.Items.Add(itemPeriod) 
    itemPeriod = Nothing 

я бы до сих пор, вероятно, сделать дата окончания более динамична (поэтому вам не нужно менять код в будущем, когда вы хотите показать больше периодов), и начало dat e также может быть динамичным (чтобы сохранить список на управляемой длине).

+0

Это работало так, как мне тоже нужно! С меньшим количеством кода, чем у меня! Спасибо, Бен! : О) – StealthRT

1

Как вы уже заметили, выход идет только к 2010 году (10/2/2010), который должен пройти весь путь до 12/31/2011.

Это прекращается, когда dtTempNow > dtTempEnd больше не является Истинной. Кроме того, вы могли бы быть интересны в String.Format

Он должен начать так:

2008 Период 13: Nov 30 - Dec 27

Почему? Вы устанавливаете nTemp на 1 в начале, почему он должен начинаться с 13?

1

Я хотел бы создать объект для хранения данных, подобные этой

Public Class Period 
    Public Property Period As Integer 
    Public Property StartOfPeriod As Date 
    Public Property EndOfPeriod As Date 
End Class 

Тогда для каждой итерации цикла While я бы ввести значения в list(of Period) после того, как ваш код процесса, использовать запрос Linq для сортировки данных используйте период и дату, а затем привяжите список к выпадающему.

Надеется, что это помогает