Oppure

Loading
24/10/09 17:52
Luciano
Salve,

Ciao,
sto tentando di popolare una Datagridview in modo asincrono ma con questo codice la form si blocca ugualmente:


    Dim myDt As New DataTable

    Private Sub Me_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim column1 As New DataColumn("column1", GetType(String))
        Dim column2 As New DataColumn("column2", GetType(Date))
        Dim column3 As New DataColumn("column3", GetType(Date))
        myDt.Columns.AddRange(New DataColumn() {column1, column2, column3})

        For i As Integer = 0 To 10000
            Dim row As DataRow = myDt.NewRow
            row(0) = "WW - " & i
            row(1) = DateTime.Today
            row(2) = DateTime.Today
            myDt.Rows.Add(row)
        Next
        Me.DataGridView1.AutoGenerateColumns = False
        Control.CheckForIllegalCrossThreadCalls = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ar As IAsyncResult = setDatasourceDeleg.BeginInvoke(myDt, Nothing, Nothing)
    End Sub

    Delegate Sub SetDatasourceDelegate(ByVal dt As DataTable)

    Dim setDatasourceDeleg As New SetDatasourceDelegate(AddressOf SetDatasource)

    Private Sub SetDatasource(ByVal dt As DataTable)
        Me.DataGridView1.DataSource = myDt
    End Sub


Grazie anticipatamente.

Luciano
Ultima modifica effettuata da Il Totem 25/10/09 13:11
aaa
24/10/09 17:58
Gianluca87
a occhio sembra che hai dimenticato il databind()
aaa
25/10/09 13:14
Il Totem
Ma si blocca perchè esegui diecimila step nel form_load o perchè deve aspettare la fine del binding?
aaa
26/10/09 6:45
Luciano
Ciao.
Basta impostare Me.DataGridView1.AutoGenerateColumns = True per far funzionare l'esempio. Il problema è come impostare in background il la proprietà .Datasource della DataGridView. Il codice è perfettamente funzionante.

Grazie anticipatamente.

Luciano
aaa
26/10/09 16:28
Luciano
Postato originariamente da Il Totem:

Ma si blocca perchè esegui diecimila step nel form_load o perchè deve aspettare la fine del binding?


Perchè deve aspettare la fine del binding. Il clcilo è rapidissimo. Non riesco appunto a capire se posso impostare il binding in background. Dalle decine di prove che ho fatto sembrerebbe proprio di no.

Luciano
aaa
26/10/09 16:44
Luciano
Postato originariamente da Il Totem:

Ma si blocca perchè esegui diecimila step nel form_load o perchè deve aspettare la fine del binding?


Ciao Totem, scusami ma non ti ho risposto correttamente. Ho fatto talmente tante prove che sono fuso...
Ricapitolando: in tutte le prove che ho fatto (utilizzando backgroundworker e/o deleagati) la form si bloccava al momento del binding (quindi dopo il ciclo) e riprendeva a funzionare dopo qualche secondo.

Col codice che ti ho postato invece, la form non si blocca al momento del binding (quindi funziona benissimo) ma si blocca alla fine. Si blocca proprio tutta l'applicazione. A questo punto (spero) che il problema stia nel non corretto uso del delegate.

Grazie anticipatamente.

Luciano
aaa
27/10/09 17:21
Il Totem
Forse perchè hai omesso EndInvoke? Non so bene se la sua funzione sia solo quella di restituisce il risultato dell'operazione asincrona al chiamate oppure se serva in qualche modo per terminare il thread (ad esempio perchè potrebbe essere stato messo in Join fino alla chiamata di EndInvoke).
aaa