2016-03-31 7 views
1

У меня есть GridView, который заполняется из источника данных, как например:vb.net: Как присвоить значение списка переменных динамически

Date    Hours 
January/2016  26.31 
January/2016  25.65 
February/2016  12.3 
    ....   ...  .... 

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

For intMonth = 1 To 12 
    For X = 0 To GridView.Rows.Count - 1 

     intDate = Convert.ToDateTime(gvTiempos.Rows(X).Cells(0).Text) 

     If DatePart("m", intDate) = intMonth Then 
      Calcular()    
     End If 

     Next 
Next 

Это Calcular() функция:

Public Function Calcular() 
Select Case intMonth 
    Case 1: JanWeeks+=1 
    Case 2: FebWeeks+=1 
    ... 
    Case 12: DecWeeks+=1 

То, что я хотел бы сделать это, чтобы избежать всего Calcular() функции, и сделать это «динамически».

Другими словами, я хотел бы получить что-то вроде этого:

Weeks(intMonth) = "Sum of Weeks for that month" 

Где intMonth детерминированным, в котором WeekVariable Сумму будет хранить эту.
Я пробовал метод List(Of T) неудачно, потому что это создает список переменных со статическим значением, согласно моему пониманию.

Заранее спасибо

+0

Вы можете использовать словарь 'colMonths (intMonth) + = 1' Если у вас есть источник данных, вы должны использовать его, а не элемент управления. Вероятно, вы можете написать запрос linq и получить все 12 (?) Результатов сразу. Также похоже, что вы должны включить Option Strict – Plutonix

+0

Возможно, вам лучше использовать массив. Затем просто используйте 'Weeks (intMonth) = Weeks (intMonth) + 1'. На боковой ноте вы можете исключить эту строку: 'intDate = GridView.Rows (X) .Cells (0) .Text'. Это значение не используется, и вы переназначаете его на следующей строке. – Icemanind

+0

@Icemanind yep ypu правы в этой строке, только что отредактировав код, была ошибкой. О 'Weeks (intMonth) = Weeks (intMonth) + 1' эта ошибка: Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. – abichango

ответ

1

согласно нашей беседы в комментариях, вы должны быть в состоянии просто сделать это:

Dim Weeks(12) As Integer 

Затем заменить вызов Calcular() этому:

If DatePart("m", intDate) = intMonth Then 
    Weeks(intMonth) = Weeks(intMonth) + 1 
End If 

Это создает массив для хранения суммы за каждый месяц в течение года (12 месяцев).

1

Учитывая DataTable dt как DataSource и клетки/пункт 1 (а не 0) имеет отформатированную дату, вы можете создать Dictionary(of Int32, Int32) провести подсчет за каждый месяц. Итерирование таблицы должно быть быстрее, чем ковыряться вокруг элемента управления; кроме того, DataTable - это данные.

Dim col As New Dictionary(Of Int32, Int32) 
' create 12 keys for 12 months 
For n As Int32 = 1 To 12 
    col.Add(n, 0) 
Next 

For Each row As DataRow In dt.Rows 
    col(Convert.ToDateTime(row(1)).Month) += 1 
Next 

Некоторые слоты будут равны нулю, потому что код добавил их все раньше времени. A List(Of Int32) также будет работать с использованием MonthList(n) для представления месяца N-1. Вы также можете просто запросить таблицу, группу и считать в одной строке:

Dim monthCount = dt.AsEnumerable.GroupBy(Function(v) v.Field(Of DateTime)(1).Month, 
          Function(k, v) New With {.Month = k, .Count = v.Count()}). 
         ToArray() 

В этом случае результат является емким список с месяцем и счетов (мой списком дат были: {#1/11/2016#, #1/23/2016#, #1/16/2016#, #2/11/2016#, #4/15/2016#}):

enter image description here

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