Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] DataGridWiev

Salve a tutti,
in un form voglio creare una datagrid che contenda un numero di righe 
variabile ed un numero di colonne fisse.
In pratica le righe rappresentano i giorni di un determinato mese.
Al cambio del mese, ovviamente la grid si aggiorna con il numero di 
giorni corretto.
in più nell'intestazione di riga ci metto giorno della settimana e 
giorno del mese e tramite una funzione coloro i giorni festivi.
questo è il codice che uso.
Function CambioMese(ByVal Data As Date)
         Dim DaysMonth As Integer = Date.DaysInMonth(Year(Data), 
Month(Data))
         dgMensilità.Rows.Clear()
         dgMensilità.Rows.Add(DaysMonth)
         lblMese.Text = Format(Data, "MMMM").ToUpper
         For i = 0 To DaysMonth - 1
             Dim DataAnalizzata As Date = CDate(i + 1 & "/" & 
Month(Data) & "/" & Year(Data))
             dgMensilità.Rows(i).HeaderCell.Value = 
Format(DataAnalizzata, "ddd dd")
             If IsHoliday(DataAnalizzata) Then
                 dgMensilità.Rows(i).DefaultCellStyle.BackColor = Color.Red
             ElseIf IsWeekend(DataAnalizzata) Then
                 dgMensilità.Rows(i).DefaultCellStyle.BackColor = Color.Pink
             Else
                 dgMensilità.Rows(i).DefaultCellStyle.BackColor = 
Color.White
             End If
         Next
         Return 0
     End Function
Il tutto funziona perfettamente, ma con una lentezza che non mi aspettavo.
Ho provato ad eliminare le varie funzioni lasciando solo la 
ricostruzione delle righe della grid ed ho osservato che è proprio 
quella ad essere molto lenta.... e stiamo parlando di massimo 31 righe!
Sapete spiegarmi come mai e se sbaglio in qualcosa come posso correggerlo?
Grazie a tutti per l'attenzione!

 wrote in news:imq4b9$mfj$
1...@speranza.aioe.org
:
[cut]

il problema e' che stai tentando di gestire la grid come se fosse una
datatable. 
secondo me ti conviene crearti un'oggetto con la lista delle date (una
datatable, una lista, quello che preferisci), fare il binding e poi
gestire la formattazione delle righe sull'evento databound della
griglia.
(per il nome dell'evento controlla che sono andato a memoria) 
dovresti ottenere prestazioni migliori.
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 quella ad essere molto lenta.... e stiamo parlando di massimo 31 righe!
"Lenta" in che ordine di grandezza?
Ho fatto una finestra vuota con solo un DataGridView da 20 colonne e
un MonthCalendar, il cui codice completo è più sotto; ho solo messo un
sorrugato alle tue IsHoliday ecc. per il resto è uguale... a dire il
vero ho anche tolto tutte le istruzioni in compatibilità VB6, che sono
poco utili visto che c'è l'equivalente in .net nativo, ma voglio
sperare che non avessero un impatto così grosso sulle prestazioni
(altrimenti, problema risolto...)
   Sub CambioMese(ByVal Data As DateTime)
      Dim DaysMonth As Integer = DateTime.DaysInMonth(Data.Year,
Data.Month)
      DataGrid1.Rows.Clear()
      DataGrid1.Rows.Add(DaysMonth)
      For i As Integer = 0 To DaysMonth - 1
         Dim DataAnalizzata As New DateTime(Data.Year, Data.Month, i +
1)
         DataGrid1.Rows(i).HeaderCell.Value =
DataAnalizzata.ToString("ddd dd")
         If DataAnalizzata.DayOfWeek = DayOfWeek.Sunday Then
            DataGrid1.Rows(i).DefaultCellStyle.BackColor = Color.Red
         ElseIf DataAnalizzata.DayOfWeek = DayOfWeek.Saturday Then
            DataGrid1.Rows(i).DefaultCellStyle.BackColor = Color.Pink
         Else
            DataGrid1.Rows(i).DefaultCellStyle.BackColor =
Color.White()
         End If
      Next
   End Sub
   Private Sub MonthCalendar1_DateChanged(ByVal sender As
System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs)
Handles MonthCalendar1.DateChanged
      CambioMese(MonthCalendar1.SelectionRange.Start)
   End Sub
Anche cliccando abbastanza furiosamente sulle frecce di cambio mese
del MonthCalendar, la griglia ha solo un minimo di incertezza nel
disegnarsi (giusto se tengo il mouse premuto fisso, e comunque senza
brutti effetti di flickering)... tu invece quanto lento lo vedi?