Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338

    [c#, winform] DataGridView, thread e InvalidOperationException

    Ciao..

    ho una applicazione tramite cui tengo sotto controllo lo stato acceso/spento dei pc della rete, i cui dati sono memorizzati in un db e visualizzati in una DataGridView. Quando eseguo il poll dei pc per controllare lo stato, saltuariamente si verifica una eccezione InvalidOperationException con il seguente messaggio:

    {"BindingSource non può essere l'origine dati di sé stessa. Non impostare le proprietà DataSource e DataMember su valori che rimandano a BindingSource."}

    Oggi son riuscito ad individuare uno dei punti in cui l'errore si verifica e non riesco a capire la motivazione. Il codice:

    codice:
            // creazione del thread di verifica stato client, elenco completo
            private void ThreadVerificaStatoClientElenco()
            {
                // controlla se la verifica è già in corso
                if (_verifica_stato_incorso == 0)
                {
                    System.Threading.Thread thStatusCompleto =
                            new System.Threading.Thread(
                            new System.Threading.ThreadStart(VerificaStatoClient));
                    thStatusCompleto.IsBackground = true;
                    // disabilita possibilità di lanciare un nuovo thread finchè questo non termina
                    _verifica_stato_incorso = 1;
                    btnStatus.Enabled = false;
                    btnStatusSelected.Enabled = false;
    
                    // ferma timer avvisi
                    timerAggiornaCasi.Enabled = false;
    
                    thStatusCompleto.Start();
                }
            }
    
    // verifica stato dei pc client in elenco
            private void VerificaStatoClient()
            {
                int ip = 0;
                string strIP, status = "", nomehost = "";
    
                _client_off = 0;
                _client_on = 0;
                _client_unknown = 0;
    
                // per ogni client
                int tot = dgvElencoClient.RowCount; 
                for (int i = 0; i < tot; i++)
                {
                    // indirizzo ip del client
                    strIP = dgvElencoClient.Rows[i].Cells["IP"].Value.ToString();
    
                    if (strIP == "")
                        ip = 0;
                    else
                    {
                        string strLastIP = strIP.Substring(strIP.LastIndexOf('.') + 1);
                        ip = int.Parse(strLastIP);
                    }
                    // sede
                    int idSede = Convert.ToInt32(dgvElencoClient.Rows[i].Cells["IdSede"].Value);  // qui viene generata l'eccezione -----------------
    
                    // se sono su DHCP (190..199) o ip = 0,null => guardo nome macchina
                    if ((ip == 0) || (idSede == 1 && (ip >= 190 && ip <= 199)))
                    {
                        // indirizzo IP non valido
    
                        // considero il nomehost: se è significativo verifica lo status altimenti no
                        nomehost = dgvElencoClient.Rows[i].Cells["Client"].Value.ToString();
    
                        if (nomehost == "")
                            status = "-";
                        else
                        {
                            status = FC.VerificaStato(nomehost);
    
                            // prova anche con il nome di dominio completo
                            if (status == "-")
                            {
                                nomehost += ".casa.local";
                                status = FC.VerificaStato(nomehost);
                            }
                        }
                    }
                    else
                        status = FC.VerificaStato(strIP);  
    
                    // parametri da passare tramite delegato per modo thread-safe
                    object[] parametri = new object[2];
                    parametri[0] = i;
                    parametri[1] = status;
                    this.BeginInvoke(new DSCDelegate(DisplayStatusClient), parametri);
                }
    
                // chiamata thread-safe per aggiornamento totali client
                this.BeginInvoke(new EventHandler(AggiornaTotali));
            }
    trovo strana l'eccezione poichè se verifico in runtime i controlli e le variabili tutti i valori hanno senso.

  2. #2
    Utente di HTML.it L'avatar di taz50
    Registrato dal
    Nov 2003
    Messaggi
    118
    Ciao,
    ma su quale riga esattamente ti trova l'exception?
    MEGLIO UN MILIONE OGGI E ..... UNO ANCHE DOMANI.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    a metà di VerificaStatoClient

    int idSede = Convert.ToInt32(dgvElencoClient.Rows[i].Cells["IdSede"].Value);

    c'è il commento a fondo riga.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.