2014-01-06 5 views
1

Я хотел бы иметь раскрывающийся список, заполненный за последние 20 недель (например,). Проблема в этом состоит в том, что, возможно, встречается еще один год. Функция, которую я написал (см. Ниже), действительно работает, если в предыдущем году не было выхода. Есть ли у кого-нибудь пример, который заполняет выпадающий список или массив за последние 20 недель, принимая во внимание культуру?Заполните ниспадающий указатель неделями за последние 20 недель

Private Sub LoadWeeknumbers() 
     Dim ciCurr As CultureInfo = CultureInfo.CurrentCulture 
     ' fill the combobox with the last 10 weeks 
     ddlWeeknumber.Items.Clear() 
     'then the 52 voorbije weken 
     For i As Integer = 0 To 52 
      Dim week As String = ciCurr.Calendar.GetWeekOfYear(DateTime.Now.AddDays(i * -7), CalendarWeekRule.FirstDay, DayOfWeek.Monday) 
      Dim weeknr As String = week + "/" & DateTime.Now.AddDays(i * -7).Year.ToString() 
      weeknr = weeknr.Replace("54/", "1/") 'for some reason 54 is in this loop, so we replace it 

      ddlWeeknumber.Items.Add("Week: " & weeknr.ToString) 
     Next 
    End Sub 

ответ

1

Может быть что-то вроде этого:

Dim week = GetIso8601WeekOfYear(DateTime.Now) 
Dim year = DateTime.Now.Year 
For i As Integer = 0 To 19 
    ddlWeeknumber.Items.Add("Week: " + week.ToString() + "/" + year.ToString()) 
    If week = 1 Then 
     week = 52 
     year -= 1 
    Else 
     week -= 1 
    End If 
Next 

Public Shared Function GetIso8601WeekOfYear(time As DateTime) As Integer 
    Dim day As DayOfWeek = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time) 
    If day >= DayOfWeek.Monday AndAlso day <= DayOfWeek.Wednesday Then 
     time = time.AddDays(3) 
    End If 

    Return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) 
End Function 
+0

Этот код кажется слишком упрощенным для того, что запрашивает ОП. На самом деле проблема, с которой он жалуется, - это когда задействованы два года; ваш код учитывает единый счетчик недели, а не один год. Если я не понял, что ожидает OP ... – varocarbas

+0

благодарит за ответ !. Это не работает. Проблема в первом дневном времени, в случае недели 1/2014, это ПОНЕДЕЛЬНИК 30 ДЕКАБРЯ, а номер недели - 53, что неверно. также изменение на firstfourdayweek не решает эту проблему, но я не уверен, почему. –

+0

@real_yggdrasil, как объяснялось в моем ответе, это не ошибка; это результат определенных правил, которые вы должны понимать. Но вопрос в том, хотите ли вы один недельный счетчик в год или нет? – varocarbas

0

Проблема возникает, когда год начинается в середине недели, так что оператор

DateTime.Now.AddDays(i * -7) вернется с последнюю неделю предыдущего год и пропустите 1 неделя с этого года

Я переписал код VB.NET следующим образом. Это может решить проблему (К сожалению, я не эксперт в VB.NET)

Private Sub LoadWeeknumbers() 
    Dim ciCurr As CultureInfo = CultureInfo.CurrentCulture 
    ' fill the combobox with the last 10 weeks 
    ddlWeeknumber.Items.Clear() 
    'then the 52 voorbije weken 
    Dim weekOverlapped As Boolean = False 

    For i As Integer = 0 To 52 
     Dim date as DateTime = DateTime.Now.AddDays(i * -7) 

     If date.Year <> DateTime.Now.Year And weekOverlapped <> True 
      date = new DateTime(DateTime.Now.Year, 1, 1) 
      weekOverlapped = True 
     End IF 

     Dim week As String = ciCurr.Calendar.GetWeekOfYear(date , CalendarWeekRule.FirstDay, DayOfWeek.Monday) 
     Dim weeknr As String = week + "/" & date.Year.ToString() 
     weeknr = weeknr.Replace("54/", "1/") 'for some reason 54 is in this loop, so we replace it 

     ddlWeeknumber.Items.Add("Week: " & weeknr.ToString) 
    Next 
End Sub 
+0

i edit 'var' to' dim' –

0

Спасибо за помощь!

Мне удалось создать нужный список, используя другой подход. Результатом кода ниже является нужный список, но без элемента 53/2013.

Private Sub LoadWeeknumbers() 
    Dim currentCulture = CultureInfo.CurrentCulture 
    Dim week As Integer = currentCulture.Calendar.GetWeekOfYear(DateTime.Now, currentCulture.DateTimeFormat.CalendarWeekRule.FirstFourDayWeek, currentCulture.DateTimeFormat.FirstDayOfWeek) 
    Dim weeksAdded = 0 
    For i As Integer = week To 1 Step -1 
     ' Dim week As String = ciCurr.Calendar.GetWeekOfYear(DateTime.Now.AddDays(i * -7), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) 
     Dim weeknr As String = i & "/" & DateTime.Now.Year.ToString() 
     weeknr = weeknr.Replace("54/", "1/") 'for some reason 54 is in this loop, so we replace it 

     ddlWeeknumber.Items.Add("Week: " & weeknr.ToString) 
     weeksAdded += 1 
    Next i 
    'now add another set of weeknumbers to the dropdownlist 
    Dim nextDate = New DateTime(DateTime.Now.Year - 1, 12, 27) 
    week = currentCulture.Calendar.GetWeekOfYear(nextDate, currentCulture.DateTimeFormat.CalendarWeekRule.FirstFourDayWeek, currentCulture.DateTimeFormat.FirstDayOfWeek) 

    For i As Integer = week To 1 Step -1 
     If (weeksAdded < 53) Then 
      ' Dim week As String = ciCurr.Calendar.GetWeekOfYear(DateTime.Now.AddDays(i * -7), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) 
      Dim weeknr As String = i & "/" & nextDate.Year.ToString() 
      weeknr = weeknr.Replace("54/", "1/") 'for some reason 54 is in this loop, so we replace it 

      ddlWeeknumber.Items.Add("Week: " & weeknr.ToString) 
      weeksAdded += 1 
     End If 
    Next i 

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