+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Errore rendendo colonna DGV invisibile

  1. #1
    L'avatar di orpo970
    orpo970 non  in linea Scolaretto
    Buongiorno a tutti,

    ho un DGV per la visione di dati prelevati da una tabella composta da un campo ID ed una serie di altri campi. A questo punto della programmazione vorrei nascondere la colonna contenente il campo id, il programma funziona regolarmente se visualizzo i dati ma se provo ad inserire un nuovo record mi causa un eccezione cosa che invece non fa se la stessa colonna non la rendo invisibile.

    Aggiungo che, per scelta, lo stesso ID viene generato dal programma e non in automatico da SQL Server, inserito nella prima riga disponibile, che manualmente provvedo a completare e poi salvato nel db

    Possibile che l'eccezione mi venga generata perche essendo invisibile non si copi il valore ID generato dal programma nella cella ?

    Grazie a tutti anticipatamente

  2. #2
    L'avatar di SirJo
    SirJo non  in linea Scolaretto
    se ricordo bene (vado a memoria):
    DataGridView1.Columns("nomedellacolonnaoindice").Visible = False
    

  3. #3
    L'avatar di Brontolo
    Brontolo non  in linea Very Important Person
    Quote Originariamente inviato da orpo970 Visualizza il messaggio
    ... mi causa un' eccezione...
    Quale eccezione e dove. Non credi che sarebbero informazioni utili?
    ℹ️ Leggi di pi su Brontolo ...

  4. #4
    L'avatar di orpo970
    orpo970 non  in linea Scolaretto
    SirJo l'istruzione corretta : DataGridView1.Columns(indice).Visible = False, comunque grazie per la risposta

    Brontolo, l'eccezione non l'ho indicata perch non una conseguenza diretta, premesso che tra le altre cose verifica anche se un campo immesso duplicato o meno, quello successivo per la precisione, mi da 2 errori: 1 che il dato immesso gi presente ed ovviamente non vero, il 2 "impossibile eliminare la nuova riga non salvata" ed io per la precisione st aggiungendo una nuova riga.

    Ovviamente se rendo la colonna visibile funziona tutto

  5. #5
    L'avatar di Brontolo
    Brontolo non  in linea Very Important Person
    Senza vedere il codice interessato non si pu dire niente.
    ℹ️ Leggi di pi su Brontolo ...

  6. #6
    L'avatar di orpo970
    orpo970 non  in linea Scolaretto
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    Senza vedere il codice interessato non si pu dire niente.
    Hai ragione ma come detto nei precedenti post l'errore che mi da una conseguenza al fatto che rendo visibile o meno la colonna dell'ID pertanto non sono riuscito a circorscrivere il codice errato, dovrei postare tutti i 600 righi di codice. Provero a creare un form di test e verificare il comportamento del DGV con e senza colonna sperando si verifichi un'eccezione piu' esplicit e ragionare su questa.

  7. #7
    Non servono 600 righe di codice ma le righe che chiariscano come accedi (per leggere e per scrivere) ai dati presenti nella DGV.
    ℹ️ Leggi di pi su Fix ...

  8. #8
    L'avatar di orpo970
    orpo970 non  in linea Scolaretto
    Premesso che al momento ho risolto bypassando il problema vi posto il codice interessato che genera l'errore, errore che viene generato in quanto viene caricata due volte la stessa riga ed i programma attraverso una funzione che controlla se un determinato valore duplicato o meno rigetta l'insert.

    Private Sub MyDGVFiscalYears_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles MyDGVFiscalYears.CellValueChanged
            'Nuovo Record
            If SelectDataMode = False Then
                If Me.saltapassaggio = False Then
                    Dim rigacorrente As Int16 = CType((MyDGVFiscalYears.CurrentCell.RowIndex) + 1, Int16)
                    If rigacorrente > NumberRows Then
                        TempMyDGVRow = CType(MyDGVFiscalYears.CurrentCell.RowIndex.ToString, Int16)
                        If MyDGVFiscalYears.CurrentCell.ColumnIndex = 1 Then
                            If MyDGVFiscalYears.Item(1, TempMyDGVRow).Value Is Nothing Then
                                MyDGVFiscalYears.Item(1, TempMyDGVRow).Value = ""
                            End If
                            If YearVerificationCheck(MyDGVFiscalYears.CurrentRow.Cells(1).Value.ToString) = True Then
                                MyDGVFiscalYears.Item(2, TempMyDGVRow).Value = CType("01/01/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                MyDGVFiscalYears.Item(3, TempMyDGVRow).Value = CType("31/12/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                MyDGVFiscalYears.Item(4, TempMyDGVRow).Value = False
                                If MyDGVFiscalYears.CurrentRow.Cells(1).Value.ToString = CurrentYear Then
                                    MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = True
                                Else
                                    MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = False
                                End If
                                MyDGVFiscalYears.Rows(TempMyDGVRow).Tag = "InsertRecord"
                            Else
                                MessageBox.Show("Valore immesso non valido." & Environment.NewLine & Environment.NewLine & "Immettere un valore Univoco, Numerico, compreso tra 1900 e " & CurrentYear)
                                MyDGVFiscalYears.Rows.Remove(MyDGVFiscalYears.Rows(TempMyDGVRow))
                            End If
                        End If
                    Else
                        gIDFiscalYears = CType(MyDGVFiscalYears.CurrentRow.Cells(0).Value.ToString, Integer)
                        'Aggiornamento Record
                        TempMyDGVRow = CType(MyDGVFiscalYears.CurrentCell.RowIndex.ToString, Int16)
                        If MyDGVFiscalYears.CurrentCell.ColumnIndex = 1 Then
                            If MyDGVFiscalYears.Item(1, TempMyDGVRow).Value Is Nothing Then
                                MyDGVFiscalYears.Item(1, TempMyDGVRow).Value = ""
                            End If
                            If YearVerificationCheck(MyDGVFiscalYears.CurrentRow.Cells(1).Value.ToString) = True Then
                                MyDGVFiscalYears.Item(2, TempMyDGVRow).Value = CType("01/01/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                MyDGVFiscalYears.Item(3, TempMyDGVRow).Value = CType("31/12/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                MyDGVFiscalYears.Item(4, TempMyDGVRow).Value = False
                                If MyDGVFiscalYears.CurrentRow.Cells(1).Value.ToString = Date.Now.ToString("yyyy") Then
                                    MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = True
                                Else
                                    MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = False
                                End If
                            Else
                                If abc = False Then
                                    MessageBox.Show("Valore immesso non valido." & Environment.NewLine & Environment.NewLine & "Immettere un valore Univoco, Numerico, compreso tra 1900 e " & CurrentYear)
                                    SelectDataMyDGVFiscalYearsIndexLastRowSelected()
                                ElseIf abc = True Then
                                    MyDGVFiscalYears.Item(2, TempMyDGVRow).Value = CType("01/01/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                    MyDGVFiscalYears.Item(3, TempMyDGVRow).Value = CType("31/12/" & CType(MyDGVFiscalYears.Item(1, TempMyDGVRow).Value.ToString, Integer), Date)
                                    MyDGVFiscalYears.Item(4, TempMyDGVRow).Value = False
                                    If MyDGVFiscalYears.CurrentRow.Cells(1).Value.ToString = Date.Now.ToString("yyyy") Then
                                        MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = True
                                    Else
                                        MyDGVFiscalYears.Item(5, TempMyDGVRow).Value = False
                                    End If
                                    abc = False
                                End If
                            End If
                        End If
                        MyDGVFiscalYears.Rows(TempMyDGVRow).Tag = "UpdateRecord"
                    End If
                End If
            End If
        End Sub
    
    Questo il codice che inserisce i dati nelle celle 2,3 e 4

    La cella 1 viene inserita manualmente ed soggetta a verifica al seguente controllo

    Function YearVerificationCheck(ByVal Text As String) As Boolean
            Dim Number As Integer
            Dim DuplicateYear As Boolean = False
            Dim Result As Boolean = Int32.TryParse(Text, Number)
            Dim aa As Int16 = 0
            For i = 0 To CType(MyDGVFiscalYears.DisplayedRowCount(True) - 2, Int16)
                If Equals(Text, MyDGVFiscalYears.Item(1, i).Value.ToString) = True Then
                    aa = aa + CType(1, Int16)
                End If
            Next
            If aa > 1 Then
                DuplicateYear = True
            End If
            If Result = True And DuplicateYear = False And Number > 1899 And Number <= CType(CurrentYear, Int16) Then
                Return True
            Else
                Return False
            End If
        End Function
    
    infine la cella 0 viene inserita in fase di salvataggio dei dati dove c' una select che prima dell'insert recepisce il valore MAX del campo ID e l'incrementa di 1.

    A questo punto se la colonna ID del DGV visibile il CellValueChanged non viene richiamato, il test duplicati non viene richiamato nuovamente e l'insert funziona regolarmente, viceversa viene richiamato il CellValueChanged e conseguenzialmente il test duplicati che rieseguendo lo stesso test mi ritorna che il valore gi esistente e quindi mi boccia l'inserimento.

    Ho risolto evitando che il test venga eseguito 2 volte per ogni riga aggiunta ma un escamotage che vorrei evitare o meglio vorrei comprendere il suddetto comportamento.

    Spero di aver postato abbastanza da farrvi comprendere meglio il problema, saluti

  9. #9
    Qualcosa non torna.... il CellValueChanged viene richiamato ogni volta che il valore della cella viene modificato, non importa se la colonna visibile o meno.

    Quello che invece potrebbe avvenire, visto che chiami 2 volte qualche procedura, che la prima volta sia generato l'evento a causa di una modifica, mentre la seconda volta no, perch stata gi modificata con la prima chiamata.

    Se fai una banale prova con un Button ed una Datagridview, vedrai che l'evento CellValueChanged verr generato ogni volta che modifichi da codice il valore di una cella, sia con colonna visibile che con colonna nascosta.
    ℹ️ Leggi di pi su Fix ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [vb15]: Errore nel caricare una colonna CheckedBox
    Da maninblack nel forum Visual Basic .Net
    Risposte: 5
    Ultimo Post: 17-07-2017, 14:19
  2. Nascondere colonna o meglio renderla INVISIBILE
    Da GianlucaM nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 04-09-2012, 10:14
  3. Risolto: [VB2010E] Errore: spazio nei nomi di colonna del db Access
    Da giampy.123 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 10-02-2012, 10:29
  4. Risposte: 1
    Ultimo Post: 11-09-2009, 20:20
  5. errore run time su colonna chiave
    Da francof nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 01-08-2007, 10:42