Member 14587396 Ответов: 4

Как получить 3 комбо-бокса, заполненных годами, месяцами и неделями? Я использую VB.NET и я новичок в программировании.


У меня есть три поля со списком, так что, когда я нажимаю на одно, оно дает выпадающий список лет до 2099 года, а другое-месяцы, а другое-недели, соответствующие месяцу, выбранному для этого года.

Что я уже пробовал:

Именно это я и пытался сделать...
for year as integer = DateTime. Now. Year To 2099 Step 1
cbxYear. Items. Add(year)
Next

Dim i As Integer
Dim months As String
Do While i<=12
months =MonthName(i, True)
cbxMonth. Items. Add(months)
i=i+1
Loop
...

Пожалуйста, помогите!

Richard MacCutchan

- Пожалуйста, помогите!"
С помощью чего? Вы не объяснили, в чем проблема.

Member 14587396

Я уже объяснял это, но все еще могу повторить.
У меня есть три поля со списком, я хочу, чтобы при нажатии на один из них в течение года он давал выпадающий список лет до 2099 года для выбора, а когда я нажимаю на другой в течение месяцев, он также дает выпадающий список месяцев в этом году для выбора и, наконец, когда я нажимаю на один в течение недель, соответствующее количество недель к месяцу, выбранному для этого года, появится в выпадающем списке для выбора.
Я серьезно не знаю, как это сделать.
То, что я пробовал, не делает того, чего я хочу.

4 Ответов

Рейтинг:
17

Maciej Los

Основываясь на предложении @RickZeeland и @MadMyche, я создал функцию, которая возвращает массив целых чисел, соответствующих неделям для конкретного года и месяца.

Public Function GetWeeksNumbers(yr As Integer, mth As Integer) As Integer()
	Dim weeks As Dictionary(Of Integer, DateTime) = New Dictionary(Of Integer, DateTime)
	Dim curr As System.Globalization.CultureInfo = System.Globalization.CultureInfo.CurrentCulture
	Dim dtStart As DateTime = New DateTime(yr, mth, 1)
	Dim dtEnd As DateTime = dtStart.AddMonths(1).AddDays(-1)
	Dim dt As DateTime = dtStart
	
	Do While dt <= dtEnd
		Dim i As Integer  = curr.Calendar.GetWeekOfYear(dt, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
		If Not weeks.ContainsKey(i) Then
			weeks.Add(i, dt)
		End If
		dt = dt.AddDays(1)		
	Loop
	
	Return weeks.Select(Function(kvp) kvp.Key).ToArray()
	
End Function


Использование:
Dim weeks As Integer() = GetWeeksNumbers(2019, 9) 'replace constant values with values comes from corresponding comboboxes
Dim i As Integer = 0
With Me.ComboBoxWeeks.Items
    .Clear()
    For i = LBound(weeks) To UBound(weeks)
        .Add(i)
    Next
End With


Member 14587396

Мацей Лос, спасибо за вашу помощь до сих пор, но я получаю ошибку на
"Dim weeks As Integer () = GetWeeksNumbers( 2019 , 9 )"
Ошибка заключается в следующем:" значение типа 'Integer' не может быть преобразовано в '1-мерный массив целых чисел'
Я заменил его значениями из моего combobox, но все еще имел эту ошибку.
Спасибо за дальнейшую помощь!

Maciej Los

Мое лучшее предположение таково: а GetWeeksNumbers() объявление метода неверно. Вы, вероятно, определяете это так:

Public Function GetWeeksNumbers(yr As Integer, mth As Integer) As Integer

вместо
Public Function GetWeeksNumbers(yr As Integer, mth As Integer) As Integer()

Вы видите разницу?

Member 14587396

Да, теперь это исправлено, но значение, возвращаемое в функции, теперь дает ту же ошибку.
Я вернул "недели" в функцию.
Разве я не прав в этом?

Maciej Los

Нет. Он возвращает массив целых чисел. "недели" - это имя переменной, которая используется для хранения этого массива.

Member 14587396

Я попытался запустить программу без возврата значения и она показывает предупреждение но затем еще одна ошибка в этой строке,
Dim dtStart As DateTime = New DateTime(yr, mth, 1 ).
Ошибка заключается в том, что "параметры Year, Month и Day описывают непредставимую дату-время".
Этого я тоже не понимаю.

Maciej Los

?!?
Где вы используете этот код ОД? Внутри функции или вне ее?

Member 14587396

внутри функции GetWeeksNumber

Maciej Los

Это тоже должно сработать, потому что yr и mth передаются в качестве параметра функции, если только вы не передадите null (nothing). Используйте отладчик, чтобы выяснить это.

Member 14587396

Пожалуйста, извините, что я задаю слишком много вопросов.
Какое значение я должен вернуть в функции GetWeeksNumber?

Maciej Los

Массив целых чисел.

Member 14587396

Пожалуйста, не могли бы вы показать, как это делается в отношении функции GetWeeksNumber.
Я знаю, что тебе сейчас очень скучно, но это то, что может вызвать полный новичок вроде меня.
Спасибо Вам за помощь до сих пор.
Я начинаю понимать некоторые вещи лучше.

Maciej Los

Пожалуйста, внимательно прочтите мой ответ. Я уже показывал тебе, как им пользоваться. Все что вам нужно сделать это двигаться [Использование] участие в cbxMonth_SelectedIndexChange() процедура. Затем вы должны пройти своды бомбобоксов: cbxYear и cbxMonth к этой строке:

Dim weeks As Integer() = GetWeeksNumbers(cbxYear.SelectedValue, cbxMonth.SelectedValue)

Но мне нужно это сделать предупредить вас это SelectedValue может вернуться null (nothing) Так что вы должны проверить, если SelectedValue конечно, combobox не является нулевым! Для получения более подробной информации, пожалуйста, смотрите: ComboBox SelectedItem, SelectedValue, SelectedWhat??? – jaredpar в блог[^]

Member 14587396

Большое вам спасибо, сэр.
Теперь я все решил.

Maciej Los

Всегда пожалуйста.

Рейтинг:
1

RickZeeland

Вы можете использовать Разделе мы рассмотрим Событие, смотрите пример здесь: комбинированный список.События Selectedindexchanged (Системы.Окна.Формы) | Microsoft Docs[^]


Maciej Los

5ed!

Рейтинг:
1

OriginalGriff

Начните с рассмотрения структуры TimeSpan: Период Структуры (Система) | Майкрософт Документы[^] - это то, что вы получаете, когда вычитаете два значения даты и времени.
Так что если у вас есть конец периода (2099/12/31 или 2099/01/01) и вычесть текущую дату (DateTime.Теперь) вы получите значение TimeSpan, которое будет представлять количество дней между ними. Это не очень поможет вам непосредственно, потому что это не может дать вам недели или месяцы, потому что они являются "относительными величинами" - они не являются абсолютным числом, потому что они могут довольно заметно измениться между сегодняшним и завтрашним днем.

Но... это может помочь: Работа с возрастом: это не то же самое, что промежуток времени![^] код написан на языке C#, но он довольно очевиден и дает вам нужные цифры.


Рейтинг:
0

MadMyche

Возможно, вы захотите использовать Calenda класс который - Представляет время в делениях, таких как недели, месяцы и годы.", а также GetWeekOfYear метод, который поможет вам также - просто дайте ему дату, о которой идет речь, и Валлах у вас есть номер недели

Ссылка:
Календарный Класс (Система.Глобализация) | Microsoft Docs[^]


Member 14587396

пожалуйста, не могли бы вы сделать для меня иллюстрацию в коде.
Я проверил ссылку, но не могу понять, что делать

MadMyche

Логика, которую вы используете, будет зависеть от вас, и это не зависит от меня, чтобы исправить ее; и я действительно не знаю, какова общая картина вашего приложения, чтобы определить, является ли этот курс действий правильным.

Тем не менее, если это было мое....
1. Лет будет статический список, а также месяцев
2. Как только все вышеперечисленное будет выбрано, я получу номер недели, основанный на 1-м дне выбранного месяца

Maciej Los

5ed!

MadMyche

Спасибо