Imports System.IO
Imports System.Xml.Serialization
Public Class frmGrav

    Private Affichage_Termine As Boolean = False 'pour éviter que le programme ne gère ce module alors que l'affichage n'est pas fini d'être mis en place
    Private Sub Tc1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TC1.SelectedIndexChanged
        Select Case TC1.SelectedIndex
            Case 0 'Onglet utilisation des tamis
                Select Case Beton.NbGravillon
                    Case 1
                        Call Affichage_Tamis(0)
                        Call Visibilite_Tamis2(False)
                    Case 2
                        Call Affichage_Tamis(0)
                        If Gravillon.Count > 1 Then
                            Call Visibilite_Tamis2(True)
                            Call Affichage_Tamis(1)
                        End If
                End Select
            Case 1 ' onglet caractéristique gravillon n°1
                Call Affichage_Gravillon(0, Gravillon.Item(0).Choix_mesureGranulo)
            Case 2 ' onglet caractéristique gravillon n°2
                If Gravillon.Count > 1 Then
                    Call Affichage_Gravillon(1, Gravillon.Item(1).Choix_mesureGranulo)
                End If
        End Select
    End Sub

    Private Sub TC1_Enter(sender As Object, e As EventArgs) Handles TC1.Enter

    End Sub

    Private Sub Tc1_Deselecting(sender As Object, e As TabControlCancelEventArgs) Handles TC1.Deselecting
        Dim Verif As Boolean = True
        Select Case e.TabPageIndex
            Case 0 'Onglet 1  
                Affichage_Termine = True '  l'affichage terminé d'être mis en place
                Call Lecture_Tamis(0, Verif) : If Verif = False Then e.Cancel = True : Exit Sub
                If Beton.NbGravillon = 2 AndAlso Gravillon.Count > 1 Then Call Lecture_Tamis(1, Verif) : If Verif = False Then e.Cancel = True : Exit Sub

            Case 1 'Onglet 2  = Gravillon n°1
                Call Lecture(0, Verif) : If Verif = False Then e.Cancel = True : Exit Sub

            Case 2 'Onglet 3  = Gravillon n°2
                If Gravillon.Count > 1 Then Call Lecture(1, Verif) : If Verif = False Then e.Cancel = True : Exit Sub

        End Select
    End Sub

    Private Sub BtnOK_Click(sender As Object, e As EventArgs) Handles BtnOK.Click
        Dim verif As Boolean = True
        For i = 1 To Beton.NbGravillon
            Call Lecture_Tamis(i - 1, verif)
            If verif = False Then Exit Sub
            Call Lecture(i - 1, verif)
            If verif = False Then Exit Sub
            Call Verif_Gravillon(i - 1, verif)
            If verif = False Then Exit Sub
        Next
        'Call Verification(verif): If verif = False Then Exit Sub
        Call Transfert_refus_tamisat(0)
        If Beton.NbGravillon = 2 Then Call Transfert_refus_tamisat(1)
        If Sable.Count > 0 AndAlso Gravillon.Count > 0 Then frmLaboBeton.MnuFormulation.Enabled = True
        Me.Dispose()
        Me.Finalize()
    End Sub

    ''' <summary>Programme de verification des données sur les caractéristiques techniques du gravillon renseigné</summary>
    '''  <param name="i">index du gravillon à vérifier, peut prendre les valeurs 0 pour le gravillon n°1 et 1 pour le gravillon n°2, l'index commence à 0.</param>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub Verif_Gravillon(ByVal i As Integer, ByRef Verif As Boolean)
        Dim msg As String = String.Empty
        With Gravillon.Item(i)
            If .Densite < 2 Then
                MessageBox.Show("Gravillon n°" & (i + 1).ToString & " - Densité = " & .Densite.ToString("#0.00") & " < 2 = granulat léger. Non conforme aux spécifications du logiciel.",
                                       "Module de vérification des données du gravillon", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                Verif = False
            End If
            If .Densite > 3 Then
                MessageBox.Show("Gravillon n°" & (i + 1).ToString & " - Densité = " & .Densite.ToString("#0.00") & " > 3 = granulat lourd. Non conforme aux spécifications du logiciel.",
                                      "Module de vérification des données du gravillon", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                Verif = False
            End If
            If Beton.CompPondHumide = True Then
                If .Humidite > 0.09 Then
                    Dim reponse As DialogResult
                    reponse = MessageBox.Show("Gravillon n°" & (i + 1).ToString & " - Teneur en eau = " & (.Humidite * 100).ToString("#0.00") & " > 10% = Gravillon saturé en eau. Non conforme aux spécifications du logiciel." &
                                              Environment.NewLine & ". Validez-vous cette valeur ?", "Module de vérification des données du gravillon", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                    If reponse = Windows.Forms.DialogResult.No Then
                        If Verif = True Then Verif = False
                    Else
                        msg = "Gravillon n°" & (i + 1).ToString & " - Teneur en eau = " & (.Humidite * 100).ToString("#0.00") & " > 20% = Gravillon saturé en eau. Non conforme aux spécifications du logiciel." & Environment.NewLine
                        Aff.msg_Avertiss.Add(msg)
                    End If
                End If
            End If
        End With
    End Sub
    Private Sub BtnAnnuler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnnuler.Click
        Me.Dispose()
        Me.Finalize()
    End Sub

#Region "Gestion des textbox"
    Private Sub TextNom_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextNom.Enter
        TextNom.SelectionStart = 0
        TextNom.SelectionLength = TextNom.Text.Length
    End Sub
    Private Sub TextNom2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextNom2.Enter
        TextNom2.SelectionStart = 0
        TextNom2.SelectionLength = TextNom2.Text.Length
    End Sub
    Private Sub TxtDensiteSeche_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtDensiteSeche.Enter
        TxtDensiteSeche.SelectionStart = 0
        TxtDensiteSeche.SelectionLength = TxtDensiteSeche.Text.Length
    End Sub
    Private Sub TxtDensiteSeche_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtDensiteSeche.KeyPress
        Call Gestion_Keypress(e, TxtDensiteSeche, True, False)
    End Sub
    Private Sub TxtDensiteSeche2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtDensiteSeche2.Enter
        TxtDensiteSeche2.SelectionStart = 0
        TxtDensiteSeche2.SelectionLength = TxtDensiteSeche2.Text.Length
    End Sub
    Private Sub TxtDensiteSeche2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtDensiteSeche2.KeyPress
        Call Gestion_Keypress(e, TxtDensiteSeche2, True, False)
    End Sub
    Private Sub Txthumidite_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtHumidite.Enter
        TxtHumidite.SelectionStart = 0
        TxtHumidite.SelectionLength = TxtHumidite.Text.Length
    End Sub
    Private Sub TxtHumidite_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtHumidite.KeyPress
        Call Gestion_Keypress(e, TxtHumidite, True, False)
    End Sub
    Private Sub Txthumidite2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtHumidite2.Enter
        TxtHumidite2.SelectionStart = 0
        TxtHumidite2.SelectionLength = TxtHumidite2.Text.Length
    End Sub
    Private Sub TxtHumidite2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtHumidite2.KeyPress
        Call Gestion_Keypress(e, TxtHumidite2, True, False)
    End Sub
    Private Sub Textd_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Textd.Enter
        Textd.SelectionStart = 0
        Textd.SelectionLength = Textd.Text.Length
    End Sub

    Private Sub Textd_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Textd.KeyPress
        Call Gestion_Keypress(e, Textd, True, True)
    End Sub
    Private Sub Textd2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Textd2.Enter
        Textd2.SelectionStart = 0
        Textd2.SelectionLength = Textd2.Text.Length
    End Sub

    Private Sub Textd2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Textd2.KeyPress
        Call Gestion_Keypress(e, Textd2, True, True)
    End Sub

    Private Sub TextDm_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextDm.Enter
        TextDm.SelectionStart = 0
        TextDm.SelectionLength = TextDm.Text.Length
    End Sub

    Private Sub TextDm_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextDm.KeyPress
        Call Gestion_Keypress(e, TextDm, True, True)
    End Sub

    Private Sub TextDm2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextDm2.Enter
        TextDm2.SelectionStart = 0
        TextDm2.SelectionLength = TextDm2.Text.Length
    End Sub

    Private Sub TextDm2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextDm2.KeyPress
        Call Gestion_Keypress(e, TextDm2, True, True)
    End Sub

    Private Sub TextMt_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextMt.Enter
        TextMt.SelectionStart = 0
        TextMt.SelectionLength = TextMt.Text.Length
    End Sub

    Private Sub TextMt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextMt.KeyPress
        Call Gestion_Keypress(e, TextMt, True, True)
    End Sub

    Private Sub TextMt2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextMt2.Enter
        TextMt2.SelectionStart = 0
        TextMt2.SelectionLength = TextMt2.Text.Length
    End Sub

    Private Sub TextMt2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextMt2.KeyPress
        Call Gestion_Keypress(e, TextMt2, True, True)
    End Sub

    Private Sub TextRefus2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextRefus2.Enter, TextRefus2.Click
        TextRefus2.SelectionStart = 0
        TextRefus2.SelectionLength = TextRefus2.Text.Length
    End Sub

    Private Sub TextRefus2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextRefus2.KeyPress
        Call Gestion_Keypress(e, TextRefus2, True, True)
    End Sub
    Private Sub TextRefus_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextRefus.Enter, TextRefus.Click
        TextRefus.SelectionStart = 0
        TextRefus.SelectionLength = TextRefus.Text.Length
    End Sub

    Private Sub TextRefus_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextRefus.KeyPress
        Call Gestion_Keypress(e, TextRefus, True, True)
    End Sub

#End Region

    Private Sub CbTamis_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbTamis.SelectedIndexChanged
        If Affichage_Termine = False Then Exit Sub 'pour éviter que le programme ne gère ce module alors que l'affichage n'est pas fini d'être mis en place
        Dim Tamis As Double
        If gestionderreurCB(CbTamis, EP1) = True Then
            Tamis = CDbl(CbTamis.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du tamis : " & CbTamis.Text, "Module CbTamis_SelectedIndexChanged", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        'Ecriture dans le champ de texte Refus
        With Gravillon.Item(0)
            Select Case CbRefus.SelectedIndex
                Case 0 'refus
                    If .Refus.ContainsKey(Tamis) = True Then TextRefus.Text = .Refus.Item(Tamis).ToString("#0") Else TextRefus.Text = ""
                Case 1 'refus cumulé g
                    If .RefusCumule_g.ContainsKey(Tamis) = True Then TextRefus.Text = .RefusCumule_g.Item(Tamis).ToString("#0") Else TextRefus.Text = ""
                Case 2 'refus cumulé %
                    If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then TextRefus.Text = .RefusCumule_Pourcent.Item(Tamis).ToString("#0") Else TextRefus.Text = ""
                Case 3 'tamisat cumulé g
                    If .TamisatCumule_g.ContainsKey(Tamis) = True Then TextRefus.Text = .TamisatCumule_g.Item(Tamis).ToString("#0") Else TextRefus.Text = ""
                Case 4 ' tamisat cumulé %
                    If .TamisatCumule_Pourcent.ContainsKey(Tamis) = True Then TextRefus.Text = .TamisatCumule_Pourcent.Item(Tamis).ToString("#0") Else TextRefus.Text = ""
            End Select
            .Choix_mesureGranulo = CbRefus.SelectedIndex
        End With
    End Sub

    Private Sub CbTamis2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbTamis2.SelectedIndexChanged
        If Affichage_Termine = False Then Exit Sub 'pour éviter que le programme ne gère ce module alors que l'affichage n'est pas fini d'être mis en place
        Dim Tamis As Double
        If gestionderreurCB(CbTamis2, EP1) = True Then
            Tamis = CDbl(CbTamis2.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du tamis : " & CbTamis2.Text, "Module CbTamis2_SelectedIndexChanged", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        'Ecriture dans le champ de texte Refus
        With Gravillon.Item(1)
            Select Case CbRefus2.SelectedIndex
                Case 0 'refus
                    If .Refus.ContainsKey(Tamis) = True Then TextRefus2.Text = .Refus.Item(Tamis).ToString("#0") Else TextRefus2.Text = ""
                Case 1 'refus cumulé g
                    If .RefusCumule_g.ContainsKey(Tamis) = True Then TextRefus2.Text = .RefusCumule_g.Item(Tamis).ToString("#0") Else TextRefus2.Text = ""
                Case 2 'refus cumulé %
                    If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then TextRefus2.Text = .RefusCumule_Pourcent.Item(Tamis).ToString("#0") Else TextRefus2.Text = ""
                Case 3 'tamisat cumulé g
                    If .TamisatCumule_g.ContainsKey(Tamis) = True Then TextRefus2.Text = .TamisatCumule_g.Item(Tamis).ToString("#0") Else TextRefus2.Text = ""
                Case 4 ' tamisat cumulé %
                    If .TamisatCumule_Pourcent.ContainsKey(Tamis) = True Then TextRefus2.Text = .TamisatCumule_Pourcent.Item(Tamis).ToString("#0") Else TextRefus2.Text = ""
            End Select
            .Choix_mesureGranulo = CbRefus2.SelectedIndex
        End With
    End Sub

    Private Sub TextRefus_LostFocus(sender As Object, e As EventArgs) Handles TextRefus.LostFocus
        Dim Tamis, refusTamisat As Double
        If gestionderreurCB(CbTamis, EP1) = True Then
            Tamis = CDbl(CbTamis.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du tamis : " & CbTamis.Text, "Module TextRefus_LostFocus", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        If gestionderreur(TextRefus, EP1) = True Then
            refusTamisat = CDbl(TextRefus.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du Refus/Tamisât : " & TextRefus.Text, "Module TextRefus_LostFocus", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        With Gravillon.Item(0)
            Select Case CbRefus.SelectedIndex
                Case 0 'refus
                    .Refus.Item(Tamis) = refusTamisat 'If .Refus.ContainsKey(Tamis) = True Then  Else .Refus(Tamis) = refusTamisat
                Case 1 'refus cumulé g
                    .RefusCumule_g.Item(Tamis) = refusTamisat 'If .RefusCumule_g.ContainsKey(Tamis) = True Then  Else .RefusCumule_g.Add(Tamis, refusTamisat)
                Case 2 'refus cumulé %
                    .RefusCumule_Pourcent.Item(Tamis) = refusTamisat   ' If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then  Else .RefusCumule_Pourcent.Add(Tamis, refusTamisat)
                Case 3 'tamisat cumulé g
                    .TamisatCumule_g.Item(Tamis) = refusTamisat ' If .TamisatCumule_g.ContainsKey(Tamis) = True Then  Else .TamisatCumule_g.Add(Tamis, refusTamisat)
                Case 4 ' tamisat cumulé %
                    .TamisatCumule_Pourcent.Item(Tamis) = refusTamisat ' If .TamisatCumule_Pourcent.ContainsKey(Tamis) = True Then  Else .TamisatCumule_Pourcent.Add(Tamis, refusTamisat)
            End Select
            'écriture dans le listview
            Dim i As Integer
            For i = 1 To LvTamis.Columns.Count - 1
                If Tamis = CDbl(LvTamis.Columns.Item(i).Text) Then LvTamis.Items(0).SubItems(i).Text = refusTamisat.ToString("#0") : Exit For
            Next
        End With
    End Sub

    Private Sub TextRefus2_LostFocus(sender As Object, e As EventArgs) Handles TextRefus2.LostFocus
        Dim Tamis, refusTamisat As Double
        If gestionderreurCB(CbTamis2, EP1) = True Then
            Tamis = CDbl(CbTamis2.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du tamis : " & CbTamis2.Text, "Module TextRefus_LostFocus", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        If gestionderreur(TextRefus2, EP1) = True Then
            refusTamisat = CDbl(TextRefus2.Text)
        Else
            MessageBox.Show("Erreur dans la lecture de la valeur du Refus/Tamisât : " & TextRefus2.Text, "Module TextRefus_LostFocus", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        With Gravillon.Item(1)
            Select Case CbRefus2.SelectedIndex
                Case 0 'refus
                    .Refus.Item(Tamis) = refusTamisat 'If .Refus.ContainsKey(Tamis) = True Then  Else .Refus(Tamis) = refusTamisat
                Case 1 'refus cumulé g
                    .RefusCumule_g.Item(Tamis) = refusTamisat 'If .RefusCumule_g.ContainsKey(Tamis) = True Then  Else .RefusCumule_g.Add(Tamis, refusTamisat)
                Case 2 'refus cumulé %
                    .RefusCumule_Pourcent.Item(Tamis) = refusTamisat   ' If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then  Else .RefusCumule_Pourcent.Add(Tamis, refusTamisat)
                Case 3 'tamisat cumulé g
                    .TamisatCumule_g.Item(Tamis) = refusTamisat ' If .TamisatCumule_g.ContainsKey(Tamis) = True Then  Else .TamisatCumule_g.Add(Tamis, refusTamisat)
                Case 4 ' tamisat cumulé %
                    .TamisatCumule_Pourcent.Item(Tamis) = refusTamisat
            End Select
            'écriture dans le listview
            Dim i As Integer
            For i = 1 To LvTamis2.Columns.Count - 1
                If Tamis = CDbl(LvTamis2.Columns.Item(i).Text) Then LvTamis2.Items(0).SubItems(i).Text = refusTamisat.ToString("#0") : Exit For
            Next
        End With
    End Sub

    Private Sub BtnGranulo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGranulo.Click
        With Gravillon.Item(0)
            Select Case CbRefus.SelectedIndex
                Case 0 'refus
                    .CalculTamisat(0)
                Case 1 'refus cumulé g
                    .CalculTamisat(1)
                Case 2 'refus cumulé %
                    .CalculTamisat(2)
                Case 3 'tamisat cumulé g
                    .CalculTamisat(3)
                Case 4 ' tamisat cumulé %
                    .CalculTamisat(4)
            End Select
            .Affichage_CourbeGranulo = 1
            If Beton.NbGravillon = 2 AndAlso Gravillon.Count > 1 Then Gravillon.Item(1).Affichage_CourbeGranulo = 0
            If Sable.Count > 0 Then Sable.Item(0).Affichage_CourbeGranulo = 0
            If Beton.NbSable = 2 AndAlso Sable.Count > 1 Then Sable.Item(1).Affichage_CourbeGranulo = 0
        End With
        'Appel au module d'affichage granulo
        Dim frm1 As frmGranulo
        frm1 = New frmGranulo
        frm1.Show()
    End Sub

    Private Sub BtnGranulo2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGranulo2.Click
        With Gravillon.Item(1)
            Select Case CbRefus.SelectedIndex
                Case 0 'refus
                    .CalculTamisat(0)
                Case 1 'refus cumulé g
                    .CalculTamisat(1)
                Case 2 'refus cumulé %
                    .CalculTamisat(2)
                Case 3 'tamisat cumulé g
                    .CalculTamisat(3)
                Case 4 ' tamisat cumulé %
                    .CalculTamisat(4)
            End Select
            .Affichage_CourbeGranulo = 1
            Gravillon.Item(0).Affichage_CourbeGranulo = 0
            If Sable.Count > 0 Then Sable.Item(0).Affichage_CourbeGranulo = 0
            If Beton.NbSable = 2 Then Sable.Item(1).Affichage_CourbeGranulo = 0
        End With
        'Appel au module d'affichage granulo
        Dim frm1 As frmGranulo
        frm1 = New frmGranulo
        frm1.Show()
    End Sub

    ''' <summary>Programme de lecture des données sur les gravillons renseignées</summary>
    '''  <param name="i">index du gravillon, peut prendre les valeurs 0 pour le gravillon n°1 et 1 pour le gravillon n°2, l'index commence à 0.</param>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub Lecture(ByVal i As Integer, ByRef verif As Boolean)
        Dim msg As String = String.Empty
        verif = True
        Select Case i
            Case 0
                With Gravillon.Item(i)
                    'identité du Gravillon
                    If TextNom.Text <> "" Then .NomGravillon = TextNom.Text Else EP1.SetError(TextNom, "Aucune donnée") : msg += "Le nom du Gravillon n'a pas été renseigné." & Environment.NewLine : verif = False
                    'type de forme du gravillon
                    If RBtnConcasse.Checked = True Then .Forme = 1 Else .Forme = 2
                    'Coefficient Kg
                    Select Case RbtnKg.Checked
                        Case True
                            Beton.Kg_Direct = True
                            If gestionderreur(TxtKg, EP1) = True Then Beton.Kg = CDbl(TxtKg.Text) Else msg += "La valeur du coefficient granulaire n'a pas été correctement renseignée." & Environment.NewLine : verif = False
                        Case False
                            Beton.Kg_Direct = False
                            Select Case Beton.Formulation
                                Case 1 ' Dreux-Gorisse
                                    'Qualité du gravillon
                                    Select Case CbQualiteGranulat.SelectedIndex
                                        Case 0
                                            .Qualite = 1 'qualité A
                                        Case 1 'Qualité B
                                            .Qualite = 2 'qualité B
                                        Case 2 'Qualité C
                                            .Qualite = 3 'qualité C
                                        Case 3 'Qualité D
                                            .Qualite = 4 'qualité D
                                    End Select
                                Case 2 'Baron-Ollivier
                                    'Pétrographie du gravillon
                                    Select Case CbPetrographie.SelectedIndex
                                        Case 0 'siliceux altérés
                                            .Petrographie = 1
                                        Case 1 'siliceux roulés
                                            .Petrographie = 2
                                        Case 2 'calcaire dur
                                            .Petrographie = 3
                                    End Select
                            End Select
                    End Select
                    'densité sèche
                    If gestionderreur(TxtDensiteSeche, EP1) = True Then .Densite = CDbl(TxtDensiteSeche.Text) Else msg += "La valeur de la densité sèche du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'composition pondérale humide
                    If Beton.CompPondHumide = True Then
                        If gestionderreur(TxtHumidite, EP1) = True Then .Humidite = (CDbl(TxtHumidite.Text)) / 100 Else msg += "La valeur de la teneur en eau du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                        If Beton.Formulation = 2 Then
                            If gestionderreur(TxtWabs, EP1) = True Then .Wabs = (CDbl(TxtWabs.Text)) / 100 Else msg += "La valeur du coefficient d'absorption du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                        End If
                    End If
                    'classe granulaire: dmini
                    If gestionderreur(Textd, EP1) = True Then .dg = CInt(Textd.Text) Else msg += "La valeur de d mini du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'classe granulaire: dmax
                    If gestionderreur(TextDm, EP1) = True Then .Dmg = CInt(TextDm.Text) Else msg += "La valeur de d maxi du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'masse totale echantilon
                    If gestionderreur(TextMt, EP1) = True Then .Mg = CDbl(TextMt.Text) Else msg = "La masse totale du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'refus - Tamisat
                    Call LectureGranulo(i, verif)
                End With
            Case 1
                With Gravillon.Item(i)
                    'identité du Gravillon
                    If TextNom2.Text <> "" Then .NomGravillon = TextNom2.Text Else EP1.SetError(TextNom2, "Aucune donnée") : msg += "Le nom du Gravillon n'a pas été renseigné." & Environment.NewLine : verif = False
                    'type de production du gravillon
                    If RBtnConcasse2.Checked = True Then .Forme = 1 Else .Forme = 2
                    'densité sèche
                    If gestionderreur(TxtDensiteSeche2, EP1) = True Then .Densite = CDbl(TxtDensiteSeche2.Text) Else msg += "La valeur de la densité sèche du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'composition pondérale humide
                    If Beton.CompPondHumide = True Then
                        If gestionderreur(TxtHumidite2, EP1) = True Then .Humidite = (CDbl(TxtHumidite2.Text)) / 100 Else msg += "La valeur de la teneur en eau du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                        If Beton.Formulation = 2 Then
                            If gestionderreur(TxtWabs2, EP1) = True Then .Wabs = (CDbl(TxtWabs2.Text)) / 100 Else msg += "La valeur du coefficient d'absorption du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                        End If
                    End If
                    'classe granulaire: dmini
                    If gestionderreur(Textd2, EP1) = True Then .dg = CInt(Textd2.Text) Else msg += "La valeur de d mini du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'classe granulaire: dmax
                    If gestionderreur(TextDm2, EP1) = True Then .Dmg = CInt(TextDm2.Text) Else msg += "La valeur de d maxi du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'masse totale echantilon
                    If gestionderreur(TextMt2, EP1) = True Then .Mg = CDbl(TextMt2.Text) Else msg = "La masse totale du Gravillon n'a pas été renseignée." & Environment.NewLine : verif = False
                    'refus - Tamisat
                    Call LectureGranulo(i, verif)
                End With
        End Select
        If verif = False Then
            MessageBox.Show("Erreur dans la lecture des données du gravillon n°" & (i + 1).ToString & "." & Environment.NewLine & msg, "Module de lecture des données du gravillon", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
    End Sub

    ''' <summary>Programme de lecture des données granulométriques renseignées</summary>
    '''  <param name="i">index du Gravillon</param>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub LectureGranulo(ByVal i As Integer, ByRef verif As Boolean)
        Dim msg As String = String.Empty
        verif = True
        Select Case i
            Case 0
                With Gravillon.Item(0)
                    'refus - Tamisat
                    Dim Tamis, refusTamisat As Double
                    If gestionderreurCB(CbTamis, EP1) = True Then Tamis = CDbl(CbTamis.Text) Else msg += "Erreur dans la lecture de la valeur du tamis : " & CbTamis.Text : verif = False
                    If gestionderreur(TextRefus, EP1) = True Then refusTamisat = CDbl(TextRefus.Text) Else msg += "Erreur dans la lecture de la valeur du Refus/Tamisât : " & TextRefus.Text : verif = False
                    If verif = False Then
                        MessageBox.Show("Erreur dans la lecture des données :" & Environment.NewLine & msg, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                        Exit Sub
                    End If
                    'la lecture de ces éléments n'est réalisé que si Verif = True
                    Select Case CbRefus.SelectedIndex
                        Case 0 'refus
                            If .Refus.ContainsKey(Tamis) = True Then .Refus.Item(Tamis) = refusTamisat Else .Refus.Add(Tamis, refusTamisat)
                        Case 1 'refus cumulé g
                            If .RefusCumule_g.ContainsKey(Tamis) = True Then .RefusCumule_g.Item(Tamis) = refusTamisat Else .RefusCumule_g.Add(Tamis, refusTamisat)
                        Case 2 'refus cumulé %
                            If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then .RefusCumule_Pourcent.Item(Tamis) = refusTamisat Else .RefusCumule_Pourcent.Add(Tamis, refusTamisat)
                        Case 3 'tamisat cumulé g
                            If .TamisatCumule_g.ContainsKey(Tamis) = True Then .TamisatCumule_g.Item(Tamis) = refusTamisat Else .TamisatCumule_g.Add(Tamis, refusTamisat)
                        Case 4 ' tamisat cumulé %
                            If .TamisatCumule_Pourcent.ContainsKey(Tamis) = True Then .TamisatCumule_Pourcent.Item(Tamis) = refusTamisat Else .TamisatCumule_Pourcent.Add(Tamis, refusTamisat)
                    End Select
                End With
            Case 1
                With Gravillon.Item(1)
                    'refus - Tamisat
                    Dim Tamis, refusTamisat As Double
                    If gestionderreurCB(CbTamis2, EP1) = True Then Tamis = CDbl(CbTamis2.Text) Else msg += "Erreur dans la lecture de la valeur du tamis : " & CbTamis2.Text : verif = False
                    If gestionderreur(TextRefus2, EP1) = True Then refusTamisat = CDbl(TextRefus2.Text) Else msg += "Erreur dans la lecture de la valeur du Refus/Tamisât : " & TextRefus2.Text : verif = False
                    If verif = False Then
                        MessageBox.Show("Erreur dans la lecture des données :" & Environment.NewLine & msg, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                        Exit Sub
                    End If
                    'la lecture de ces éléments n'est réalisé que si Verif = True
                    Select Case CbRefus2.SelectedIndex
                        Case 0 'refus
                            If .Refus.ContainsKey(Tamis) = True Then .Refus.Item(Tamis) = refusTamisat Else .Refus.Add(Tamis, refusTamisat)
                        Case 1 'refus cumulé g
                            If .RefusCumule_g.ContainsKey(Tamis) = True Then .RefusCumule_g.Item(Tamis) = refusTamisat Else .RefusCumule_g.Add(Tamis, refusTamisat)
                        Case 2 'refus cumulé %
                            If .RefusCumule_Pourcent.ContainsKey(Tamis) = True Then .RefusCumule_Pourcent.Item(Tamis) = refusTamisat Else .RefusCumule_Pourcent.Add(Tamis, refusTamisat)
                        Case 3 'tamisat cumulé g
                            If .TamisatCumule_g.ContainsKey(Tamis) = True Then .TamisatCumule_g.Item(Tamis) = refusTamisat Else .TamisatCumule_g.Add(Tamis, refusTamisat)
                        Case 4 ' tamisat cumulé %
                            If .TamisatCumule_Pourcent.ContainsKey(Tamis) = True Then .TamisatCumule_Pourcent.Item(Tamis) = refusTamisat Else .TamisatCumule_Pourcent.Add(Tamis, refusTamisat)
                    End Select
                End With
        End Select
    End Sub

    Private Sub frmGrav_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            With Gravillon.Item(0)
                If .Disponibilite_Tamis_Bool.Count = 20 Then
                    Dim j As Integer
                    Dim toto(23) As Double
                    j = -1
                    For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                        j += 1 : toto(j) = kvp.Key
                    Next
                    .Disponibilite_Tamis.Clear()
                    For j = 0 To 19 '20 tamis disponibles pour les gravillons
                        .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                    Next
                    'Affectation des valeurs de refus ou tamisats
                    Select Case .Choix_mesureGranulo
                        Case 0 'refus en g
                            .Refus.Clear()
                            For j = 0 To 19
                                .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(0)
                        Case 1 'refus cumulé en g
                            .RefusCumule_g.Clear()
                            For j = 0 To 19
                                .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(1)
                        Case 2 'refus cumulé en %
                            .RefusCumule_Pourcent.Clear()
                            For j = 0 To 19
                                .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(2)
                        Case 3 'Tamisats cumulés en g
                            .TamisatCumule_g.Clear()
                            For j = 0 To 19
                                .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(3)
                        Case 4 'Tamisats cumulés en %
                            .TamisatCumule_Pourcent.Clear()
                            For j = 0 To 19
                                .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                            .CalculTamisat(4)
                    End Select
                End If
            End With
            Call Affichage_Tamis(0)
            Call Affichage_Gravillon(0, Gravillon.Item(0).Choix_mesureGranulo)
            Select Case Beton.NbGravillon
                Case 1
                    TC1.TabPages.Remove(TbpGravillon2)
                    Me.Text = "Caractéristiques du gravillon"
                    Visibilite_Tamis2(False)
                Case 2
                    Me.Text = "Caractéristiques des gravillons"
                    If Gravillon.Count > 1 Then
                        Visibilite_Tamis2(True)
                        With Gravillon.Item(1)
                            If .Disponibilite_Tamis_Bool.Count = 20 Then
                                Dim j As Integer
                                Dim toto(23) As Double
                                j = -1
                                For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                    j += 1 : toto(j) = kvp.Key
                                Next
                                .Disponibilite_Tamis.Clear()
                                For j = 0 To 19 '20 tamis disponibles pour les gravillons
                                    .Disponibilite_Tamis(toto(j)) = .Disponibilite_Tamis_Bool.Item(j)
                                Next
                                'Affectation des valeurs de refus ou tamisats
                                Select Case .Choix_mesureGranulo
                                    Case 0 'refus en g
                                        .Refus.Clear()
                                        For j = 0 To 19
                                            .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                        Next
                                        .CalculTamisat(0)
                                    Case 1 'refus cumulé en g
                                        .RefusCumule_g.Clear()
                                        For j = 0 To 19
                                            .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                        Next
                                        .CalculTamisat(1)
                                    Case 2 'refus cumulé en %
                                        .RefusCumule_Pourcent.Clear()
                                        For j = 0 To 19
                                            .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                        Next
                                        .CalculTamisat(2)
                                    Case 3 'Tamisats cumulés en g
                                        .TamisatCumule_g.Clear()
                                        For j = 0 To 19
                                            .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                        Next
                                        .CalculTamisat(3)
                                    Case 4 'Tamisats cumulés en %
                                        .TamisatCumule_Pourcent.Clear()
                                        For j = 0 To 19
                                            .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                        Next
                                        .CalculTamisat(4)
                                End Select
                            End If
                        End With
                        Call Affichage_Tamis(1)
                        Call Affichage_Gravillon(1, Gravillon.Item(1).Choix_mesureGranulo)
                    End If
            End Select
            TC1.SelectedIndex = 0

        Catch ex As Exception
            MessageBox.Show("Erreur lors du chargement du formulaire:" & Environment.NewLine & "Exception: " & ex.Message, "Formulaire Gravillon", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

    ''' <summary>Affichage des tamis sélectionnés dans l'onglet Tamis</summary>
    '''  <param name="i">index du sable</param>
    Private Sub Affichage_Tamis(ByVal i As Integer)

        With Gravillon.Item(i).Disponibilite_Tamis
            Select Case i
                Case 0

                    If .Item(1) = True Then ChkbMod31.Checked = True Else ChkbMod31.Checked = False
                    If .Item(1.25) = True Then ChkbMod32.Checked = True Else ChkbMod32.Checked = False
                    If .Item(1.6) = True Then ChkbMod33.Checked = True Else ChkbMod33.Checked = False
                    If .Item(2) = True Then ChkbMod34.Checked = True Else ChkbMod34.Checked = False
                    If .Item(2.5) = True Then ChkbMod35.Checked = True Else ChkbMod35.Checked = False
                    If .Item(3.15) = True Then ChkbMod36.Checked = True Else ChkbMod36.Checked = False
                    If .Item(4) = True Then ChkbMod37.Checked = True Else ChkbMod37.Checked = False
                    If .Item(5) = True Then ChkbMod38.Checked = True Else ChkbMod38.Checked = False
                    If .Item(6.3) = True Then ChkbMod39.Checked = True Else ChkbMod39.Checked = False
                    If .Item(8) = True Then ChkbMod40.Checked = True Else ChkbMod40.Checked = False
                    If .Item(10) = True Then ChkbMod41.Checked = True Else ChkbMod41.Checked = False
                    If .Item(12.5) = True Then ChkbMod42.Checked = True Else ChkbMod42.Checked = False
                    If .Item(16) = True Then ChkbMod43.Checked = True Else ChkbMod43.Checked = False
                    If .Item(20) = True Then ChkbMod44.Checked = True Else ChkbMod44.Checked = False
                    If .Item(25) = True Then ChkbMod45.Checked = True Else ChkbMod45.Checked = False
                    If .Item(31.5) = True Then ChkbMod46.Checked = True Else ChkbMod46.Checked = False
                    If .Item(40) = True Then ChkbMod47.Checked = True Else ChkbMod47.Checked = False
                    If .Item(50) = True Then ChkbMod48.Checked = True Else ChkbMod48.Checked = False
                    If .Item(63) = True Then ChkbMod49.Checked = True Else ChkbMod49.Checked = False
                    If .Item(80) = True Then ChkbMod50.Checked = True Else ChkbMod50.Checked = False
                Case 1
                    If .Item(1) = True Then ChkbMod31_2.Checked = True Else ChkbMod31_2.Checked = False
                    If .Item(1.25) = True Then ChkbMod32_2.Checked = True Else ChkbMod32_2.Checked = False
                    If .Item(1.6) = True Then ChkbMod33_2.Checked = True Else ChkbMod33_2.Checked = False
                    If .Item(2) = True Then ChkbMod34_2.Checked = True Else ChkbMod34_2.Checked = False
                    If .Item(2.5) = True Then ChkbMod35_2.Checked = True Else ChkbMod35_2.Checked = False
                    If .Item(3.15) = True Then ChkbMod36_2.Checked = True Else ChkbMod36_2.Checked = False
                    If .Item(4) = True Then ChkbMod37_2.Checked = True Else ChkbMod37_2.Checked = False
                    If .Item(5) = True Then ChkbMod38_2.Checked = True Else ChkbMod38_2.Checked = False
                    If .Item(6.3) = True Then ChkbMod39_2.Checked = True Else ChkbMod39_2.Checked = False
                    If .Item(8) = True Then ChkbMod40_2.Checked = True Else ChkbMod40_2.Checked = False
                    If .Item(10) = True Then ChkbMod41_2.Checked = True Else ChkbMod41_2.Checked = False
                    If .Item(12.5) = True Then ChkbMod42_2.Checked = True Else ChkbMod42_2.Checked = False
                    If .Item(16) = True Then ChkbMod43_2.Checked = True Else ChkbMod43_2.Checked = False
                    If .Item(20) = True Then ChkbMod44_2.Checked = True Else ChkbMod44_2.Checked = False
                    If .Item(25) = True Then ChkbMod45_2.Checked = True Else ChkbMod45_2.Checked = False
                    If .Item(31.5) = True Then ChkbMod46_2.Checked = True Else ChkbMod46_2.Checked = False
                    If .Item(40) = True Then ChkbMod47_2.Checked = True Else ChkbMod47_2.Checked = False
                    If .Item(50) = True Then ChkbMod48_2.Checked = True Else ChkbMod48_2.Checked = False
                    If .Item(63) = True Then ChkbMod49_2.Checked = True Else ChkbMod49_2.Checked = False
                    If .Item(80) = True Then ChkbMod50_2.Checked = True Else ChkbMod50_2.Checked = False
            End Select
        End With
    End Sub

    ''' <summary>Affichage des tamis pour le gravillon n°2 si ce dernier existe dans l'onglet Tamis</summary>
    '''  <param name="Affiche"> = TRUE si visible</param>
    Private Sub Visibilite_Tamis2(ByVal Affiche As Boolean)
        If Affiche = True Then LblTamisSable2.Visible = True Else LblTamisSable2.Visible = False
        If Affiche = True Then ChkbMod31_2.Visible = True Else ChkbMod31_2.Visible = False
        If Affiche = True Then ChkbMod32_2.Visible = True Else ChkbMod32_2.Visible = False
        If Affiche = True Then ChkbMod33_2.Visible = True Else ChkbMod33_2.Visible = False
        If Affiche = True Then ChkbMod34_2.Visible = True Else ChkbMod34_2.Visible = False
        If Affiche = True Then ChkbMod35_2.Visible = True Else ChkbMod35_2.Visible = False
        If Affiche = True Then ChkbMod36_2.Visible = True Else ChkbMod36_2.Visible = False
        If Affiche = True Then ChkbMod37_2.Visible = True Else ChkbMod37_2.Visible = False
        If Affiche = True Then ChkbMod38_2.Visible = True Else ChkbMod38_2.Visible = False
        If Affiche = True Then ChkbMod39_2.Visible = True Else ChkbMod39_2.Visible = False
        If Affiche = True Then ChkbMod40_2.Visible = True Else ChkbMod40_2.Visible = False
        If Affiche = True Then ChkbMod41_2.Visible = True Else ChkbMod41_2.Visible = False
        If Affiche = True Then ChkbMod42_2.Visible = True Else ChkbMod42_2.Visible = False
        If Affiche = True Then ChkbMod43_2.Visible = True Else ChkbMod43_2.Visible = False
        If Affiche = True Then ChkbMod44_2.Visible = True Else ChkbMod44_2.Visible = False
        If Affiche = True Then ChkbMod45_2.Visible = True Else ChkbMod45_2.Visible = False
        If Affiche = True Then ChkbMod46_2.Visible = True Else ChkbMod46_2.Visible = False
        If Affiche = True Then ChkbMod47_2.Visible = True Else ChkbMod47_2.Visible = False
        If Affiche = True Then ChkbMod48_2.Visible = True Else ChkbMod48_2.Visible = False
        If Affiche = True Then ChkbMod49_2.Visible = True Else ChkbMod49_2.Visible = False
        If Affiche = True Then ChkbMod50_2.Visible = True Else ChkbMod50_2.Visible = False
    End Sub

    ''' <summary>Lecture des données dans l'onglet Tamis</summary>
    '''  <param name="j">index du gravillon</param>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub Lecture_Tamis(ByVal j As Integer, ByRef Verif As Boolean)
        Dim i As Integer = 0
        Verif = True

        With Gravillon.Item(j).Disponibilite_Tamis
            Select Case j
                Case 0
                    If ChkbMod31.Checked = True Then .Item(1) = True : i += 1 Else .Item(1) = False
                    If ChkbMod32.Checked = True Then .Item(1.25) = True : i += 1 Else .Item(1.25) = False
                    If ChkbMod33.Checked = True Then .Item(1.6) = True : i += 1 Else .Item(1.6) = False
                    If ChkbMod34.Checked = True Then .Item(2) = True : i += 1 Else .Item(2) = False
                    If ChkbMod35.Checked = True Then .Item(2.5) = True : i += 1 Else .Item(2.5) = False
                    If ChkbMod36.Checked = True Then .Item(3.15) = True : i += 1 Else .Item(3.15) = False
                    If ChkbMod37.Checked = True Then .Item(4) = True : i += 1 Else .Item(4) = False
                    If ChkbMod38.Checked = True Then .Item(5) = True : i += 1 Else .Item(5) = False
                    If ChkbMod39.Checked = True Then .Item(6.3) = True : i += 1 Else .Item(6.3) = False
                    If ChkbMod40.Checked = True Then .Item(8) = True : i += 1 Else .Item(8) = False
                    If ChkbMod41.Checked = True Then .Item(10) = True : i += 1 Else .Item(10) = False
                    If ChkbMod42.Checked = True Then .Item(12.5) = True : i += 1 Else .Item(12.5) = False
                    If ChkbMod43.Checked = True Then .Item(16) = True : i += 1 Else .Item(16) = False
                    If ChkbMod44.Checked = True Then .Item(20) = True : i += 1 Else .Item(20) = False
                    If ChkbMod45.Checked = True Then .Item(25) = True : i += 1 Else .Item(25) = False
                    If ChkbMod46.Checked = True Then .Item(31.5) = True : i += 1 Else .Item(31.5) = False
                    If ChkbMod47.Checked = True Then .Item(40) = True : i += 1 Else .Item(40) = False
                    If ChkbMod48.Checked = True Then .Item(50) = True : i += 1 Else .Item(50) = False
                    If ChkbMod49.Checked = True Then .Item(63) = True : i += 1 Else .Item(63) = False
                    If ChkbMod50.Checked = True Then .Item(80) = True : i += 1 Else .Item(80) = False
                    Dim keyColl As Dictionary(Of Double, Boolean).KeyCollection = .Keys
                    Dim Kvp(.Count) As Double
                    Dim i1 As Integer = -1
                    For Each s As Double In keyColl : i1 += 1 : Kvp(i1) = s : Next s
                    Gravillon.Item(0).Disponibilite_Tamis_Bool.Clear() 'par précaution
                    For i1 = 0 To .Count - 1
                        Gravillon.Item(0).Disponibilite_Tamis_Bool.Add(.Item(Kvp(i1)))
                    Next
                Case 1
                    If ChkbMod31_2.Checked = True Then .Item(1) = True : i += 1 Else .Item(1) = False
                    If ChkbMod32_2.Checked = True Then .Item(1.25) = True : i += 1 Else .Item(1.25) = False
                    If ChkbMod33_2.Checked = True Then .Item(1.6) = True : i += 1 Else .Item(1.6) = False
                    If ChkbMod34_2.Checked = True Then .Item(2) = True : i += 1 Else .Item(2) = False
                    If ChkbMod35_2.Checked = True Then .Item(2.5) = True : i += 1 Else .Item(2.5) = False
                    If ChkbMod36_2.Checked = True Then .Item(3.15) = True : i += 1 Else .Item(3.15) = False
                    If ChkbMod37_2.Checked = True Then .Item(4) = True : i += 1 Else .Item(4) = False
                    If ChkbMod38_2.Checked = True Then .Item(5) = True : i += 1 Else .Item(5) = False
                    If ChkbMod39_2.Checked = True Then .Item(6.3) = True : i += 1 Else .Item(6.3) = False
                    If ChkbMod40_2.Checked = True Then .Item(8) = True : i += 1 Else .Item(8) = False
                    If ChkbMod41_2.Checked = True Then .Item(10) = True : i += 1 Else .Item(10) = False
                    If ChkbMod42_2.Checked = True Then .Item(12.5) = True : i += 1 Else .Item(12.5) = False
                    If ChkbMod43_2.Checked = True Then .Item(16) = True : i += 1 Else .Item(16) = False
                    If ChkbMod44_2.Checked = True Then .Item(20) = True : i += 1 Else .Item(20) = False
                    If ChkbMod45_2.Checked = True Then .Item(25) = True : i += 1 Else .Item(25) = False
                    If ChkbMod46_2.Checked = True Then .Item(31.5) = True : i += 1 Else .Item(31.5) = False
                    If ChkbMod47_2.Checked = True Then .Item(40) = True : i += 1 Else .Item(40) = False
                    If ChkbMod48_2.Checked = True Then .Item(50) = True : i += 1 Else .Item(50) = False
                    If ChkbMod49_2.Checked = True Then .Item(63) = True : i += 1 Else .Item(63) = False
                    If ChkbMod50_2.Checked = True Then .Item(80) = True : i += 1 Else .Item(80) = False
                    Dim keyColl As Dictionary(Of Double, Boolean).KeyCollection = .Keys
                    Dim Kvp(.Count) As Double
                    Dim i1 As Integer = -1
                    For Each s As Double In keyColl : i1 += 1 : Kvp(i1) = s : Next s
                    Gravillon.Item(1).Disponibilite_Tamis_Bool.Clear() 'par précaution
                    For i1 = 0 To .Count - 1
                        Gravillon.Item(1).Disponibilite_Tamis_Bool.Add(.Item(Kvp(i1)))
                    Next
            End Select
        End With
        If i = 0 Then
            MessageBox.Show("Erreur lors de la lecture des données de l'onglet Tamis:" & Environment.NewLine & "Aucun tamis n'a été validé.", "Module Lecture Onglet Tamis", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Verif = False
            'ElseIf i < 6 Then
            '    MessageBox.Show("Moins de 6 tamis ont été sélectionnés dans l'onglet Tamis." & Environment.NewLine & "Attention au calcul de la granulométrie.", "Module Lecture Onglet Tamis", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
    End Sub

    ''' <summary>Affichage des données dans l'onglet Gravillon</summary>
    '''  <param name="j">= index du gravillon</param>
    '''  <param name="CbrefusIndex">= index du CbRefus pour validation entre refus, refus cumulé en g, refus cumulé en %, ...</param> 
    Private Sub Affichage_Gravillon(ByVal j As Integer, ByVal CbrefusIndex As Integer) 'Optional ByVal fichierData As Boolean = False)
        With Gravillon.Item(j)
            Select Case j
                Case 0
#Region "Onglet gravillon 1"
                    'identité du gravillon
                    TextNom.Text = .NomGravillon
                    'type de gravillon
                    Select Case .Forme
                        Case 1
                            RBtnConcasse.Checked = True
                        Case 2
                            RbtnRoule.Checked = True
                    End Select
                    'Pétrographie -Qualité du granulat
                    Select Case Beton.Kg_Direct
                        Case True
                            LblPetrographie.Visible = False : CbPetrographie.Visible = False
                            LblQualiteGranulat.Visible = False : CbQualiteGranulat.Visible = False
                            RbtnKg.Checked = True
                            TxtKg.Visible = True : TxtKg.Text = Beton.Kg.ToString("#0.00")
                        Case False
                            RbtnKgGranulat.Checked = True
                            TxtKg.Visible = False
                            Select Case Beton.Formulation
                                Case 1 'Dreux-Gorisse
                                    LblPetrographie.Visible = False : CbPetrographie.Visible = False
                                    LblQualiteGranulat.Visible = True : CbQualiteGranulat.Visible = True
                                    'Qualité du gravillon
                                    Select Case .Qualite
                                        Case 1 'qualité A
                                            CbQualiteGranulat.Text = CbQualiteGranulat.Items(0).ToString
                                        Case 2 'Qualité B
                                            CbQualiteGranulat.Text = CbQualiteGranulat.Items(1).ToString
                                        Case 3 'Qualité C
                                            CbQualiteGranulat.Text = CbQualiteGranulat.Items(2).ToString
                                        Case 4 'Qualité D
                                            CbQualiteGranulat.Text = CbQualiteGranulat.Items(3).ToString
                                    End Select
                                Case 2 'Baron-Ollivier
                                    LblQualiteGranulat.Visible = False : CbQualiteGranulat.Visible = False
                                    LblPetrographie.Visible = True : LblPetrographie.Top = 66 ': LblPetrographie.Left = 282
                                    CbPetrographie.Visible = True : CbPetrographie.Top = 63 ': CbPetrographie.Left = 361
                                    'Pétrographie du gravillon
                                    Select Case .Petrographie
                                        Case 1 'siliceux altérés
                                            CbPetrographie.Text = CbPetrographie.Items(0).ToString
                                        Case 2 'siliceux roulés
                                            CbPetrographie.Text = CbPetrographie.Items(1).ToString
                                        Case 3 'calcaire dur
                                            CbPetrographie.Text = CbPetrographie.Items(2).ToString
                                    End Select
                            End Select
                    End Select
                    'densité sèche
                    TxtDensiteSeche.Text = .Densite.ToString("#0.00")
                    'composition pondérale humide
                    If Beton.CompPondHumide = True Then
                        LblHumidite1.Visible = True : LblHumidite1Pourcent.Visible = True : BtnHlpHumidite.Visible = True : TxtHumidite.Visible = True
                        TxtHumidite.Text = (.Humidite * 100).ToString("#0.00")
                        If Beton.Formulation = 2 Then
                            LblWabs.Visible = True : LblWabsPourcent.Visible = True : BtnHlpWabs.Visible = True : TxtWabs.Visible = True
                            TxtWabs.Text = (.Wabs * 100).ToString("#0.0")
                        Else
                            LblWabs.Visible = False : LblWabsPourcent.Visible = False : BtnHlpWabs.Visible = False : TxtWabs.Visible = False
                        End If
                    Else
                        LblHumidite1.Visible = False : LblHumidite1Pourcent.Visible = False : BtnHlpHumidite.Visible = False : TxtHumidite.Visible = False
                        LblWabs.Visible = False : LblWabsPourcent.Visible = False : BtnHlpWabs.Visible = False : TxtWabs.Visible = False
                    End If
                    'classe granulaire
                    Textd.Text = .dg.ToString("#0")
                    TextDm.Text = .Dmg.ToString("#0")
                    'masse totale echantilon
                    TextMt.Text = .Mg.ToString("#0")
                    'Affichage du mode de référence de la granulométrie
                    CbRefus.SelectedIndex = CbrefusIndex
                    CbRefus.Text = CbRefus.SelectedItem.ToString
                    'Tamis autorisé
                    LvTamis.Clear() 'efface toutes les colonnes
                    LvTamis.View = View.Details
                    LvTamis.Columns.Add("", 100, HorizontalAlignment.Center)
                    CbTamis.Items.Clear()
                    For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                        If kvp.Value = True Then
                            CbTamis.Items.Add(kvp.Key)
                            If kvp.Key < 0.5 Then
                                LvTamis.Columns.Add(kvp.Key.ToString("#0.000"), 50, HorizontalAlignment.Center)
                            ElseIf kvp.Key < 5 Then
                                LvTamis.Columns.Add(kvp.Key.ToString("#0.00"), 50, HorizontalAlignment.Center)
                            Else
                                LvTamis.Columns.Add(kvp.Key.ToString("#0.0"), 50, HorizontalAlignment.Center)
                            End If
                        End If
                    Next

                    Dim myline As ListViewItem
                    myline = New ListViewItem(New String() {"?"})
                    Select Case CbRefus.SelectedIndex
                        Case 0
                            myline = New ListViewItem(New String() {"Refus (g)"})
                        Case 1
                            myline = New ListViewItem(New String() {"Refus cumulé  (g)"})
                        Case 2
                            myline = New ListViewItem(New String() {"Refus cumulé  (%)"})
                        Case 3
                            myline = New ListViewItem(New String() {"Tamisât cumulé (g)"})
                        Case 4
                            myline = New ListViewItem(New String() {"Tamisât cumulé (%)"})
                    End Select
                    Dim i As Integer = 0
                    Dim toto(LvTamis.Columns.Count) As String
                    'affichage du 1ier tamis et de la valeur du refus correspondante
                    If CbTamis.Items.Count > 0 Then
                        CbTamis.Text = CbTamis.Items(0).ToString
                        TextRefus.Text = ""
                        Select Case CbRefus.SelectedIndex
                            Case 0
                                For Each kvp As KeyValuePair(Of Double, Double) In .Refus
                                    If kvp.Key = CDbl(CbTamis.Text) Then TextRefus.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 1 'dans le cas refus cumulé g
                                For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_g
                                    If kvp.Key = CDbl(CbTamis.Text) Then TextRefus.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 2 'dans le cas refus cumulé %
                                For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_Pourcent
                                    If kvp.Key = CDbl(CbTamis.Text) Then TextRefus.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 3 'dans le cas tamisat cumulé g
                                For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_g
                                    If kvp.Key = CDbl(CbTamis.Text) Then TextRefus.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 4 'dans le cas tamisat cumulé %
                                For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_Pourcent
                                    If kvp.Key = CDbl(CbTamis.Text) Then TextRefus.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                        End Select
                    End If
                    'Affichage dans le listview - 2ième ligne
                    Dim subline As ListViewItem.ListViewSubItem = New ListViewItem.ListViewSubItem(myline, toto(1))
                    myline.SubItems.Add(subline)
                    For i = 2 To LvTamis.Columns.Count - 1
                        subline = New ListViewItem.ListViewSubItem(myline, toto(i))
                        myline.SubItems.Add(subline)
                    Next
                    LvTamis.Items.Add(myline)

#End Region
                Case 1
#Region "Onglet gravillon 2"
                    'identité du gravillon
                    TextNom2.Text = .NomGravillon
                    'type de gravillon
                    Select Case .Forme
                        Case 1
                            RBtnConcasse2.Checked = True
                        Case 2
                            RbtnRoule2.Checked = True
                    End Select
                    'densité sèche
                    TxtDensiteSeche2.Text = .Densite.ToString("#0.00")
                    'composition pondérale humide
                    If Beton.CompPondHumide = True Then
                        LblHumidite2.Visible = True : LblHumidite2Pourcent.Visible = True : BtnHlpHumidite2.Visible = True : TxtHumidite2.Visible = True
                        TxtHumidite2.Text = (.Humidite * 100).ToString("#0.00")
                        If Beton.Formulation = 2 Then
                            LblWabs2.Visible = True : LblWabs2Pourcent.Visible = True : BtnHlpWabs2.Visible = True : TxtWabs2.Visible = True
                            TxtWabs2.Text = (.Wabs * 100).ToString("#0.0")
                        Else
                            LblWabs2.Visible = False : LblWabs2Pourcent.Visible = False : BtnHlpWabs2.Visible = False : TxtWabs2.Visible = False
                        End If
                    Else
                        LblHumidite2.Visible = False : LblHumidite2Pourcent.Visible = False : BtnHlpHumidite2.Visible = False : TxtHumidite2.Visible = False
                        LblWabs2.Visible = False : LblWabs2Pourcent.Visible = False : BtnHlpWabs2.Visible = False : TxtWabs2.Visible = False
                    End If
                    'classe granulaire
                    Textd2.Text = .dg.ToString("#0")
                    TextDm2.Text = .Dmg.ToString("#0")
                    'masse totale echantilon
                    TextMt2.Text = .Mg.ToString("#0")
                    'Affichage du mode de référence de la granulométrie
                    CbRefus2.SelectedIndex = CbrefusIndex
                    CbRefus2.Text = CbRefus2.SelectedItem.ToString
                    'Tamis autorisé
                    LvTamis2.Clear() 'efface toutes les colonnes
                    LvTamis2.View = View.Details
                    LvTamis2.Columns.Add("", 100, HorizontalAlignment.Center)
                    CbTamis2.Items.Clear()
                    For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                        If kvp.Value = True Then
                            CbTamis2.Items.Add(kvp.Key)
                            If kvp.Key < 0.5 Then
                                LvTamis2.Columns.Add(kvp.Key.ToString("#0.000"), 50, HorizontalAlignment.Center)
                            ElseIf kvp.Key < 5 Then
                                LvTamis2.Columns.Add(kvp.Key.ToString("#0.00"), 50, HorizontalAlignment.Center)
                            Else
                                LvTamis2.Columns.Add(kvp.Key.ToString("#0.0"), 50, HorizontalAlignment.Center)
                            End If
                        End If
                    Next

                    Dim myline As ListViewItem
                    myline = New ListViewItem(New String() {"?"})
                    Select Case CbRefus2.SelectedIndex
                        Case 0
                            myline = New ListViewItem(New String() {"Refus (g)"})
                        Case 1
                            myline = New ListViewItem(New String() {"Refus cumulé  (g)"})
                        Case 2
                            myline = New ListViewItem(New String() {"Refus cumulé  (%)"})
                        Case 3
                            myline = New ListViewItem(New String() {"Tamisât cumulé (g)"})
                        Case 4
                            myline = New ListViewItem(New String() {"Tamisât cumulé (%)"})
                    End Select
                    Dim i As Integer = 0
                    Dim toto(LvTamis2.Columns.Count) As String


                    'affichage du 1ier tamis et de la valeur du refus correspondante
                    If CbTamis2.Items.Count > 0 Then
                        CbTamis2.Text = CbTamis2.Items(0).ToString
                        TextRefus2.Text = ""
                        Select Case CbRefus2.SelectedIndex
                            Case 0
                                For Each kvp As KeyValuePair(Of Double, Double) In .Refus
                                    If kvp.Key = CDbl(CbTamis2.Text) Then TextRefus2.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis2.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 1  'dans le cas refus cumulé g
                                For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_g
                                    If kvp.Key = CDbl(CbTamis2.Text) Then TextRefus2.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis2.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 2 'dans le cas refus cumulé %
                                For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_Pourcent
                                    If kvp.Key = CDbl(CbTamis2.Text) Then TextRefus2.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis2.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 3 'dans le cas tamisat cumulé g
                                For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_g
                                    If kvp.Key = CDbl(CbTamis2.Text) Then TextRefus2.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis2.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                            Case 4 'dans le cas tamisat cumulé %
                                For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_Pourcent
                                    If kvp.Key = CDbl(CbTamis2.Text) Then TextRefus2.Text = kvp.Value.ToString("#0")
                                    For Each kvpi As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                                        If .Disponibilite_Tamis(kvpi.Key) = True AndAlso kvpi.Key = kvp.Key AndAlso i <= LvTamis2.Columns.Count - 1 Then
                                            i += 1 : toto(i) = kvp.Value.ToString("#0") : Exit For
                                        End If
                                    Next
                                Next
                        End Select
                    End If
                    'Affichage dans le listview - 2ième ligne
                    Dim subline As ListViewItem.ListViewSubItem = New ListViewItem.ListViewSubItem(myline, toto(1))
                    myline.SubItems.Add(subline)
                    For i = 2 To LvTamis2.Columns.Count - 1
                        subline = New ListViewItem.ListViewSubItem(myline, toto(i))
                        myline.SubItems.Add(subline)
                    Next
                    LvTamis2.Items.Add(myline)
#End Region
            End Select
        End With
    End Sub

#Region "Sauvegarde des données granulométriques des Gravillons 1 et 2"
    Private Sub BtnGranuloSauvegarde_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGranuloSauvegarde.Click
        Dim verif As Boolean = True
        'les données granulométriques sont renseignées au fur et à mesure
        Call LectureGranulo(0, verif)
        If verif = False Then Exit Sub
        Dim SaveFileDialog As New SaveFileDialog
        Try
            With SaveFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If
                .Title = "Enregistrer la sauvegarde du Gravillon sous ..."
                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                ' .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "granulo" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Filter = "Fichiers textes (*.granulo)|*.granulo|Tous les fichiers (*.*)|*.*"
                .FilterIndex = 1
                .RestoreDirectory = True
                .ShowDialog()
                If .FileName <> "" Then Call Ecriture_Fichier_Gravillon(0, .FileName, verif) 'ecriture du sable complet
            End With
        Catch ex As Exception
            MessageBox.Show("Aucune données sauvegardées", "Fichier de sauvegarde", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub
    Private Sub BtnGranuloSauvegarde2_Click(sender As Object, e As EventArgs) Handles BtnGranuloSauvegarde2.Click
        Dim verif As Boolean = True
        'les données granulométriques sont renseignées au fur et à mesure
        Call LectureGranulo(1, verif)
        If verif = False Then Exit Sub
        Dim SaveFileDialog As New SaveFileDialog
        Try
            With SaveFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If
                .Title = "Enregistrer la sauvegarde du Gravillon sous ..."
                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                ' .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "granulo" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Filter = "Fichiers textes (*.granulo)|*.granulo|Tous les fichiers (*.*)|*.*"
                .FilterIndex = 1
                .RestoreDirectory = True
                .ShowDialog()
                If .FileName <> "" Then Call Ecriture_Fichier_Gravillon(1, .FileName, verif) 'ecriture du sable complet
            End With
        Catch ex As Exception
            MessageBox.Show("Aucune données sauvegardées", "Fichier de sauvegarde", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

    ''' <summary>Ecriture des données granulométriques dans un fichier de sauvegarde pour les Gravillons 1 et 2</summary>
    '''  <param name="i">= index du Gravillon</param>
    '''  <param name="Filename">nom du fichier de sauvagarde</param>
    '''  <param name="Verif">renvoie FALSE si pb</param>
    Private Sub Ecriture_Fichier_Gravillon(ByVal i As Integer, ByVal Filename As String, ByRef Verif As Boolean)
        Dim myStreamWriter As StreamWriter
        Try
            myStreamWriter = File.CreateText(Filename)
            With Gravillon.Item(i)
                'caractéristiques du gravillon
                myStreamWriter.WriteLine(.Mg.ToString("#0"))
                Select Case .Choix_mesureGranulo
                    Case 0
                        myStreamWriter.WriteLine("Refus")
                        For Each kvp As KeyValuePair(Of Double, Double) In .Refus
                            If .Disponibilite_Tamis(kvp.Key) = True Then
                                myStreamWriter.WriteLine(kvp.Key.ToString("#0.000") & " " & kvp.Value.ToString("#0")) ' dim du tamis + valeur du refus
                            End If
                        Next
                    Case 1
                        myStreamWriter.WriteLine("RefusCumuleg")
                        For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_g
                            If .Disponibilite_Tamis(kvp.Key) = True Then
                                myStreamWriter.WriteLine(kvp.Key.ToString("#0.000") & " " & kvp.Value.ToString("#0")) ' dim du tamis + valeur du refus cumulé en g
                            End If
                        Next
                    Case 2
                        myStreamWriter.WriteLine("RefusCumule%")
                        For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_Pourcent
                            If .Disponibilite_Tamis(kvp.Key) = True Then
                                myStreamWriter.WriteLine(kvp.Key.ToString("#0.000") & " " & kvp.Value.ToString("#0")) ' dim du tamis + valeur du refus cumulé en %
                            End If
                        Next
                    Case 3
                        myStreamWriter.WriteLine("TamisatCumuleg")
                        For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_g
                            If .Disponibilite_Tamis(kvp.Key) = True Then
                                myStreamWriter.WriteLine(kvp.Key.ToString("#0.000") & " " & kvp.Value.ToString("#0")) ' dim du tamis + valeur du tamisat cumulé en g
                            End If
                        Next
                    Case 4
                        myStreamWriter.WriteLine("TamisatCumule%")
                        For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_Pourcent
                            If .Disponibilite_Tamis(kvp.Key) = True Then
                                myStreamWriter.WriteLine(kvp.Key.ToString("#0.000") & " " & kvp.Value.ToString("#0")) ' dim du tamis + valeur du tamisat cumulé en %
                            End If
                        Next
                    Case Else
                        MessageBox.Show("Aucune écriture dans le fichier de sauvegarde " & Filename.ToString & " pour le gravillon n°" & (i + 1).ToString & Environment.NewLine &
                                        "Le choix de la mesure granulométrique n'a pas pu être identifié.", "Module Ecriture_Fichier_Gravillon", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                        Verif = False
                End Select
            End With

            myStreamWriter.Flush()
        Catch exc As Exception
            MessageBox.Show("Erreur lors de l'écriture du fichier de sauvegarde " & Filename.ToString & " pour le Gravillon n°" & (i + 1).ToString & Environment.NewLine & exc.Message & exc.StackTrace,
                            "Module Ecriture_Fichier_Gravillon", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1)
            Verif = False
        Finally
            ' Close the object if it has been created.
            If Not myStreamWriter Is Nothing Then myStreamWriter.Close()
        End Try
    End Sub
#End Region

    Private Sub CbRefus_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbRefus.SelectedIndexChanged
        If Affichage_Termine = False Then Exit Sub 'pour éviter que le programme ne gère ce module alors que l'affichage n'est pas fini d'être mis en place
        If CbRefus.SelectedIndex = 0 Then
            LblRefusUnite.Text = "(g)"
            If LvTamis.Items.Count > 0 Then LvTamis.Items(0).SubItems(0).Text = "Refus (g)" 'Refus
        End If
        If CbRefus.SelectedIndex = 1 Then
            LblRefusUnite.Text = "(g)"
            If LvTamis.Items.Count > 0 Then LvTamis.Items(0).SubItems(0).Text = "Refus cumulé  (g)" ' Refus cumulé en g
        End If
        If CbRefus.SelectedIndex = 2 Then
            LblRefusUnite.Text = "(%)"
            If LvTamis.Items.Count > 0 Then LvTamis.Items(0).SubItems(0).Text = "Refus cumulé  (%)" ' Refus cumulé en %
        End If
        If CbRefus.SelectedIndex = 3 Then
            LblRefusUnite.Text = "(g)"
            If LvTamis.Items.Count > 0 Then LvTamis.Items(0).SubItems(0).Text = "Tamisât cumulé (g)" ' Tamisat cumulé en g
        End If
        If CbRefus.SelectedIndex = 4 Then
            LblRefusUnite.Text = "(%)"
            If LvTamis.Items.Count > 0 Then LvTamis.Items(0).SubItems(0).Text = "Tamisât cumulé (%)" ' Tamisat cumulé en %
        End If
    End Sub
    Private Sub CbRefus2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbRefus2.SelectedIndexChanged
        If Affichage_Termine = False Then Exit Sub 'pour éviter que le programme ne gère ce module alors que l'affichage n'est pas fini d'être mis en place
        If CbRefus2.SelectedIndex = 0 Then LblRefusUnite2.Text = "(g)" : LvTamis2.Items(0).SubItems(0).Text = "Refus (g)" 'Refus
        If CbRefus2.SelectedIndex = 1 Then LblRefusUnite2.Text = "(g)" : LvTamis2.Items(0).SubItems(0).Text = "Refus cumulé  (g)" ' Refus cumulé en g
        If CbRefus2.SelectedIndex = 2 Then LblRefusUnite2.Text = "(%)" : LvTamis2.Items(0).SubItems(0).Text = "Refus cumulé  (%)" ' Refus cumulé en %
        If CbRefus2.SelectedIndex = 3 Then LblRefusUnite2.Text = "(g)" : LvTamis2.Items(0).SubItems(0).Text = "Tamisât cumulé (g)" ' Tamisat cumulé en g
        If CbRefus2.SelectedIndex = 4 Then LblRefusUnite2.Text = "(%)" : LvTamis2.Items(0).SubItems(0).Text = "Tamisât cumulé (%)" ' Tamisat cumulé en %
    End Sub

#Region "Chargement des données granulométriques"
    Private Sub BtnCharger_Click(sender As Object, e As EventArgs) Handles BtnCharger.Click
        Dim OpenFileDialog As New OpenFileDialog
        Try
            With OpenFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If

                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "granulo" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Title = "Ouvrir le projet"
                .FilterIndex = 1
                .Filter = "Fichiers textes (*.granulo)|*.granulo|Tous les fichiers (*.*)|*.*"
                .Multiselect = False
                .RestoreDirectory = True
                .ShowHelp = True ' Affiche le bouton Aide et la case à cocher Lecture seule ?
                .ShowReadOnly = False
                ' Commence avec la case à cocher Lecture seule activée ? Ceci n'est justifié que si ShowReadOnly a la valeur True.
                .ReadOnlyChecked = False
                If .ShowDialog = System.Windows.Forms.DialogResult.OK Then
                    If .FileName <> "" Then
                        Dim Verif As Boolean = True
                        Dim Racine As String = String.Empty
                        Dim NomAffaire As String = String.Empty
                        'Call Lecture_chaine_Racine(.FileName, Racine, NomAffaire, Verif)
                        Dim CbRefusIndex As Integer = 0
                        Dim dd(Gravillon.Item(0).Disponibilite_Tamis.Count - 1) As Double
                        Dim i As Integer = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In Gravillon.Item(0).Disponibilite_Tamis
                            i += 1 : dd(i) = kvp.Key
                        Next
                        For i = 0 To Gravillon.Item(0).Disponibilite_Tamis.Count - 1
                            Gravillon.Item(0).Disponibilite_Tamis(dd(i)) = False
                        Next
                        Call Lecture_DataGrav(0, .FileName, CbRefusIndex, Verif)
                        If Verif = True Then
                            Call Affichage_Tamis(0)
                            Gravillon.Item(0).Choix_mesureGranulo = CbRefusIndex
                            Call Affichage_Gravillon(0, CbRefusIndex) 'True)

                        End If
                    Else
                        ' Me.Text = "Calcul de pieux suivant essais pressiométriques : [ aucun fichier de données ]"
                        MessageBox.Show("Aucun nom de fichier Data n'a été indiqué.", "Ouverture du fichier data: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If
                End If
            End With
        Catch ex As Exception
            '   Me.Text = "Calcul de pieux suivant essais pressiométriques : [ aucun fichier de données ]"
            MessageBox.Show("Erreur lors de la lecture du fichier: " & Environment.NewLine & ex.Message & ex.StackTrace, "Ouverture de fichier data: " & Aff.FileName, MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            OpenFileDialog.Dispose() 'pour libérer la mémoire
        End Try
    End Sub
    Private Sub BtnCharger2_Click(sender As Object, e As EventArgs) Handles BtnCharger2.Click
        Dim OpenFileDialog As New OpenFileDialog
        Try
            With OpenFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If

                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "granulo" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Title = "Ouvrir le projet"
                .FilterIndex = 1
                .Filter = "Fichiers textes (*.granulo)|*.granulo|Tous les fichiers (*.*)|*.*"
                .Multiselect = False
                .RestoreDirectory = True
                .ShowHelp = True ' Affiche le bouton Aide et la case à cocher Lecture seule ?
                .ShowReadOnly = False
                ' Commence avec la case à cocher Lecture seule activée ? Ceci n'est justifié que si ShowReadOnly a la valeur True.
                .ReadOnlyChecked = False
                If .ShowDialog = System.Windows.Forms.DialogResult.OK Then
                    If .FileName <> "" Then
                        Dim Verif As Boolean = True
                        'Dim Racine As String = String.Empty
                        'Dim NomAffaire As String = String.Empty
                        'Call Lecture_chaine_Racine(.FileName, Racine, NomAffaire, Verif)
                        Dim CbRefusIndex As Integer = 0
                        Dim dd(Gravillon.Item(1).Disponibilite_Tamis.Count - 1) As Double
                        Dim i As Integer = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In Gravillon.Item(1).Disponibilite_Tamis
                            i += 1 : dd(i) = kvp.Key
                        Next
                        For i = 0 To Gravillon.Item(1).Disponibilite_Tamis.Count - 1
                            Gravillon.Item(1).Disponibilite_Tamis(dd(i)) = False
                        Next
                        Call Lecture_DataGrav(1, .FileName, CbRefusIndex, Verif)
                        If Verif = True Then
                            Call Affichage_Tamis(1)
                            Gravillon.Item(1).Choix_mesureGranulo = CbRefusIndex
                            Call Affichage_Gravillon(1, CbRefusIndex) '
                        End If
                    Else
                        ' Me.Text = "Calcul de pieux suivant essais pressiométriques : [ aucun fichier de données ]"
                        MessageBox.Show("Aucun nom de fichier Data n'a été indiqué.", "Ouverture du fichier data: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If
                End If
            End With
        Catch ex As Exception
            '   Me.Text = "Calcul de pieux suivant essais pressiométriques : [ aucun fichier de données ]"
            MessageBox.Show("Erreur lors de la lecture du fichier: " & Environment.NewLine & ex.Message & ex.StackTrace, "Ouverture de fichier data: " & Aff.FileName, MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            OpenFileDialog.Dispose() 'pour libérer la mémoire
        End Try
    End Sub

    ''' <summary>Lecture de données se trouvant dans le fichier granulo</summary>
    '''  <param name="i">index du sable</param>
    '''  <param name="FileName">nom du fichier</param>
    '''  <param name="CbRefusIndex">index de CbRefus</param>
    '''  <param name="Verif">TRUE si OK</param>  
    Private Sub Lecture_DataGrav(ByVal i As Integer, ByVal FileName As String, ByRef CbRefusIndex As Integer, ByRef Verif As Boolean)
        Dim myStreamReader As StreamReader = Nothing
        Dim line, titi(2), msg As String
        Dim entete As String = String.Empty
        Dim NumLine As Integer
        Dim TotalDonnees As Integer = 1 'nombre total de données sur la ligne correspondante
        Dim nbre As Boolean = True

        Try
            myStreamReader = File.OpenText(FileName)
            line = myStreamReader.ReadLine()
            Do
                Call LectureGen(line, titi, Verif, TotalDonnees, nbre) : If Verif = False Then myStreamReader.Close() : Exit Sub  'ligne suivante
                msg = String.Empty : NumLine += 1
                Select Case NumLine
                    Case 1 'masse de l'échantillon
                        If TryCast(titi(1), String) Is Nothing Then
                            msg = "Ligne : " & line & Environment.NewLine
                            msg += "Erreur de conversion de la donnée masse échantillon, lors de la lecture du fichier des données granulométriques."
                            MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Sub
                        Else
                            If Double.TryParse(titi(1), Gravillon.Item(i).Mg) = False Then
                                msg = "Ligne : " & line & Environment.NewLine
                                msg += "La valeur masse échantillon figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Sub
                            Else
                                Gravillon.Item(i).Mg = CDbl(titi(1))
                                TotalDonnees = 1 '1 pour l'entête
                                nbre = False 'pour la ligne suivante
                            End If
                        End If
                    Case 2 'entête = refus, refus cumulé, ...
                        If TryCast(titi(1), String) Is Nothing Then
                            msg = "Aucune valeur d'entête n'a été indiquée dans le fichier des données granulométriques."
                            MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Sub
                        Else
                            entete = titi(1)
                            Select Case entete
                                Case "refus"
                                    CbRefusIndex = 0
                                Case "refuscumuleg"
                                    CbRefusIndex = 1
                                Case "refuscumule%"
                                    CbRefusIndex = 2
                                Case "tamisatcumuleg"
                                    CbRefusIndex = 3
                                Case "tamisatcumule%"
                                    CbRefusIndex = 4
                                Case Else
                                    msg = "La valeur d'entête (= " & entete.ToString & " ) n'est pas correctement indiquée dans le fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Sub
                            End Select
                            TotalDonnees = 2 '2 pour le tamis et la valeur
                            nbre = True 'pour la ligne suivante
                        End If
                    Case Is > 2 'données granulométrique
                        'lecture de la dimension du tamis
                        Dim Tamis As Double
                        If TryCast(titi(1), String) Is Nothing Then
                            msg = "Ligne : " & line & Environment.NewLine
                            msg += "Erreur de conversion de la donnée masse échantillon, lors de la lecture du fichier des données granulométriques."
                            MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Do
                        Else
                            If Double.TryParse(titi(1), Tamis) = False Then
                                msg = "Ligne : " & line & Environment.NewLine
                                msg += "La valeur dimension du tamis figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                            Else
                                Dim Existe As Boolean = False
                                Tamis = CDbl(titi(1))
                                'vérification que la dimension du tamis existe
                                For Each kvp As KeyValuePair(Of Double, Boolean) In Gravillon.Item(i).Disponibilite_Tamis
                                    If kvp.Key = Tamis Then
                                        Gravillon.Item(i).Disponibilite_Tamis(kvp.Key) = True : Existe = True : Exit For
                                    End If
                                Next
                                If Existe = False Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur sur la dimension du tamis lors de la lecture du fichier des données granulométriques." & Environment.NewLine
                                    msg += "Sortie du module de lecture"
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Do
                                End If
                            End If
                        End If
                        'lecture du refus ou refus cumulé ou ....
                        Select Case entete
                            Case "refus"
                                Dim toto As Double
                                If TryCast(titi(2), String) Is Nothing Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur de conversion de la donnée refus, lors de la lecture du fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                Else
                                    If Double.TryParse(titi(2), toto) = False Then
                                        msg = "Ligne : " & line & Environment.NewLine
                                        msg += "La valeur refus figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                        MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Gravillon.Item(i).Refus(Tamis) = CDbl(titi(2))
                                    End If
                                End If
                            Case "refuscumuleg"
                                Dim toto As Double
                                If TryCast(titi(2), String) Is Nothing Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur de conversion de la donnée refus cumulé g, lors de la lecture du fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                Else
                                    If Double.TryParse(titi(2), toto) = False Then
                                        msg = "Ligne : " & line & Environment.NewLine
                                        msg += "La valeur refus cumulé g figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                        MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Gravillon.Item(i).RefusCumule_g(Tamis) = CDbl(titi(2))
                                    End If
                                End If
                            Case "refuscumule%"
                                Dim toto As Double
                                If TryCast(titi(2), String) Is Nothing Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur de conversion de la donnée refus cumulé %, lors de la lecture du fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                Else
                                    If Double.TryParse(titi(2), toto) = False Then
                                        msg = "Ligne : " & line & Environment.NewLine
                                        msg += "La valeur refus cumulé % figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                        MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Gravillon.Item(i).RefusCumule_Pourcent(Tamis) = CDbl(titi(2))
                                    End If
                                End If
                            Case "tamisatcumuleg"
                                Dim toto As Double
                                If TryCast(titi(2), String) Is Nothing Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur de conversion de la donnée tamisat cumulé g, lors de la lecture du fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                Else
                                    If Double.TryParse(titi(2), toto) = False Then
                                        msg = "Ligne : " & line & Environment.NewLine
                                        msg += "La valeur tamisat cumulé g figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                        MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Gravillon.Item(i).TamisatCumule_g(Tamis) = CDbl(titi(2))
                                    End If
                                End If
                            Case "tamisatcumule%"
                                Dim toto As Double
                                If TryCast(titi(2), String) Is Nothing Then
                                    msg = "Ligne : " & line & Environment.NewLine
                                    msg += "Erreur de conversion de la donnée tamisat cumulé %, lors de la lecture du fichier des données granulométriques."
                                    MessageBox.Show(msg, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                Else
                                    If Double.TryParse(titi(2), toto) = False Then
                                        msg = "Ligne : " & line & Environment.NewLine
                                        msg += "La valeur tamisat cumulé % figurant dans le fichier des données granulométriques ne correspond pas à une valeur numérique."
                                        MessageBox.Show(msg, "Private Sub Lecture_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Gravillon.Item(i).TamisatCumule_Pourcent(Tamis) = CDbl(titi(2))
                                    End If
                                End If
                        End Select
                End Select

                line = myStreamReader.ReadLine()
            Loop Until line Is Nothing

        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture du fichier des données granulométriques du gravillon n°" & (i + 1).ToString & Environment.NewLine & "Exception: " & ex.Message & ex.StackTrace, "Private Sub Lecture_DataGrav()", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Verif = False
        Finally
            If Not myStreamReader Is Nothing Then myStreamReader.Close() ' Close the object if it has been created.
        End Try
    End Sub
#End Region


    Private Sub BtnChargerGravillon1_Click(sender As Object, e As EventArgs) Handles BtnChargerGravillon1.Click
        Call Lecture_DataGravillon(0)
    End Sub
    Private Sub BtnChargerGravillon2_Click(sender As Object, e As EventArgs) Handles BtnChargerGravillon2.Click
        Call Lecture_DataGravillon(1)
    End Sub

    ''' <summary>Lecture du fichier de sauvegarde des données caractérisant le Gravillon</summary>
    '''  <param name="inum">index du sable</param>  
    Private Sub Lecture_DataGravillon(ByVal iNum As Integer)
        Try
            Dim OpenFileDialog As New OpenFileDialog
            With OpenFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If
                .Filter = "Fichiers xml (*.xml)|*.xml|Tous les fichiers (*.*)|*.*"
                .FilterIndex = 1
                .RestoreDirectory = True
                .ShowDialog()
                If .FileName <> "" Then
                    Call Mise_a_zero_gravillon(iNum)
                    Dim Verif As Boolean = True
                    Dim Racine As String = String.Empty
                    Dim NomAffaire As String = String.Empty
                    Call Lecture_chaine_Racine(.FileName, Racine, NomAffaire, Verif)
                    Me.Text = "Laboratoire béton  :  [ " & NomAffaire & " ]"
                    'si verif = TRUE, la lecture du fichier est correcte et le calcul peut continuer sinon le calcul est arreté. 
                    Dim Grav1 As New clsGravillon
                    Call DeSerializeSysKeysInterne(.FileName, Grav1, Grav1)
                    Select Case iNum
                        Case 0
                            If Gravillon.Count = 0 Then
                                Gravillon.Add(Grav1)
                            Else
                                Gravillon.Item(iNum) = Grav1
                            End If
                        Case 1
                            If Gravillon.Count = 1 Then
                                Gravillon.Add(Grav1)
                            Else
                                Gravillon.Item(iNum) = Grav1
                            End If
                    End Select
                    Call Affectation(iNum)
                    If Verif = False Then
                        Exit Sub
                    Else
                        Select Case Beton.NbGravillon
                            Case 1
                                Call Affichage_Tamis(0)
                                Call Visibilite_Tamis2(False)
                                Call Affichage_Gravillon(0, Gravillon.Item(0).Choix_mesureGranulo)' onglet caractéristique Gravillon n°1
                            Case 2
                                Call Affichage_Tamis(0)
                                Call Affichage_Gravillon(0, Gravillon.Item(0).Choix_mesureGranulo) ' onglet caractéristique Gravillon n°1
                                If Gravillon.Count > 1 Then
                                    Call Visibilite_Tamis2(True)
                                    Call Affichage_Tamis(1)
                                    Call Affichage_Gravillon(1, Gravillon.Item(1).Choix_mesureGranulo) ' onglet caractéristique Gravillon n°2
                                End If
                        End Select
                    End If
                End If
            End With
        Catch ex As Exception
            MessageBox.Show("Problème de lecture des caractéristique du gravillon n°" & (iNum + 1).ToString & Environment.NewLine & Environment.NewLine & "Erreur: " & ex.Message, "Module Lecture_DataGravillon", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try

    End Sub

    ''' <summary>Lecture du fichier de sauvegarde des données caractérisant le Gravillon</summary>
    '''  <param name="Path">Chemin d'accès</param>
    '''  <param name="Objet">Objet à désérialiser</param>
    '''  <param name="Grav1">pour affectation dans un objet Gravillon</param>
    Private Sub DeSerializeSysKeysInterne(ByVal Path As String, ByVal Objet As Object, ByRef Grav1 As clsGravillon)
        Call LoadXmlData1(Path, Objet)
        Grav1 = CType(Objet, clsGravillon)
    End Sub
    Private Sub LoadXmlData1(ByVal Path As String, ByRef Objet As Object)

        Dim Type As Type = Objet.GetType
        Dim Serializeur As New XmlSerializer(Type)
        Dim Fi As New FileInfo(Path)
        If Fi.Directory.Exists = False Then System.IO.Directory.CreateDirectory(Fi.DirectoryName)
        'Sérialization
        Using fs As New FileStream(Path, FileMode.Open, FileAccess.Read)
            Objet = Serializeur.Deserialize(fs)
            fs.Close()
        End Using
    End Sub

    ''' <summary>Ecriture de l'affectation des valeurs sauvegardées dans les dictionary du gravillon</summary>
    '''  <param name="iNum">index du gravillon</param>  
    Private Sub Affectation(ByVal iNum As Integer)
        With Gravillon.Item(iNum)
            'Rappel: tous les dictionary ont la même taille
            'TRANSFERT Pour les Tamis
            Dim i As Integer
            Dim dd(.Disponibilite_Tamis.Count - 1) As Double
            i = -1
            For Each kvp As KeyValuePair(Of Double, Boolean) In .Disponibilite_Tamis
                i += 1 : dd(i) = kvp.Key
            Next
            'transfert de la collection .Disponibilite_Tamis_Bool vers le dictionary .Disponibilite_Tamis => Même dimension
            .Disponibilite_Tamis.Clear()
            For i = 0 To .Disponibilite_Tamis_Bool.Count - 1
                .Disponibilite_Tamis.Add(dd(i), .Disponibilite_Tamis_Bool.Item(i))
            Next
            'TRANSFERT Pour les valeurs de Refus ou tamisats
            Select Case .Choix_mesureGranulo
                Case 0 '"refus"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .Refus => Même dimension
                    .Refus.Clear()
                    For i = 0 To .Val_Tamisat_Refus.Count - 1
                        .Refus(dd(i)) = .Val_Tamisat_Refus.Item(i)
                    Next
                Case 1 '"refuscumuleg"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .refuscumule_g => Même dimension
                    .RefusCumule_g.Clear()
                    For i = 0 To .Val_Tamisat_Refus.Count - 1
                        .RefusCumule_g(dd(i)) = .Val_Tamisat_Refus.Item(i)
                    Next
                Case 2 '"refuscumule%"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .RefusCumule_Pourcent => Même dimension
                    .RefusCumule_Pourcent.Clear()
                    For i = 0 To .Val_Tamisat_Refus.Count - 1
                        .RefusCumule_Pourcent(dd(i)) = .Val_Tamisat_Refus.Item(i)
                    Next
                Case 3 '"tamisatcumuleg"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .TamisatCumule_g => Même dimension
                    .TamisatCumule_g.Clear()
                    For i = 0 To .Val_Tamisat_Refus.Count - 1
                        .TamisatCumule_g.Add(dd(i), .Val_Tamisat_Refus.Item(i))
                    Next
                Case 4 ' "tamisatcumule%"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .TamisatCumule_Pourcent => Même dimension
                    .TamisatCumule_Pourcent.Clear()
                    For i = 0 To .Val_Tamisat_Refus.Count - 1
                        .TamisatCumule_Pourcent.Add(dd(i), .Val_Tamisat_Refus.Item(i))
                    Next
                Case Else
                    'msg = "La valeur d'entête (= " & entete.ToString & " ) n'est pas correctement indiquée dans le fichier des données granulométriques."
                    'MessageBox.Show(msg, "Private Sub Lecture_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Verif = False : Exit Sub
            End Select
        End With
    End Sub
    Private Sub BtnSauvegardeGravillon_Click(sender As Object, e As EventArgs) Handles BtnSauvegardeGravillon.Click
        Dim Verif As Boolean = True
        Call Lecture_Tamis(0, Verif)
        If Verif = False Then MessageBox.Show("Erreur de lecture dans le module Lecture_Tamis(0, Verif)", "Private BtnSauvegardeSable_Click()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Exit Sub
        Call Transfert_refus_tamisat(0)
        Call Sauvegarde_DataGravillon(0)
    End Sub

    Private Sub BtnSauvegardeGravillon2_Click(sender As Object, e As EventArgs) Handles BtnSauvegardeGravillon2.Click
        Dim Verif As Boolean = True
        Call Lecture_Tamis(1, Verif)
        If Verif = False Then MessageBox.Show("Erreur de lecture dans le module Lecture_Tamis(1, Verif)", "Private BtnSauvegardeSable_Click()", MessageBoxButtons.OK, MessageBoxIcon.Warning) : Exit Sub
        Call Transfert_refus_tamisat(1)
        Call Sauvegarde_DataGravillon(1)
    End Sub

    ''' <summary>Transfert des données du Dictionary vers le List(of) caractérisant le gravillon</summary>
    '''  <param name="iNum">index du gravillon</param>  
    Private Sub Transfert_refus_tamisat(ByVal iNum As Integer)
        With Gravillon.Item(iNum)
            'TRANSFERT Pour les valeurs de Refus ou tamisats
            .Val_Tamisat_Refus.Clear() 'pour être sur de n'avoir qu'une série de valeur
            Select Case .Choix_mesureGranulo
                Case 0 '"refus"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .Refus => Même dimension
                    For Each kvp As KeyValuePair(Of Double, Double) In .Refus
                        .Val_Tamisat_Refus.Add(kvp.Value)
                    Next
                Case 1 '"refuscumuleg"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .refuscumule_g => Même dimension
                    For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_g
                        .Val_Tamisat_Refus.Add(kvp.Value)
                    Next
                Case 2 '"refuscumule%"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .RefusCumule_Pourcent => Même dimension
                    For Each kvp As KeyValuePair(Of Double, Double) In .RefusCumule_Pourcent
                        .Val_Tamisat_Refus.Add(kvp.Value)
                    Next
                Case 3 '"tamisatcumuleg"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .TamisatCumule_g => Même dimension
                    For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_g
                        .Val_Tamisat_Refus.Add(kvp.Value)
                    Next
                Case 4 ' "tamisatcumule%"
                    'transfert de la collection .Val_Tamisat_Refus vers le dictionary .TamisatCumule_Pourcent => Même dimension
                    For Each kvp As KeyValuePair(Of Double, Double) In .TamisatCumule_Pourcent
                        .Val_Tamisat_Refus.Add(kvp.Value)
                    Next
            End Select
        End With
    End Sub

    ''' <summary>Ecriture du fichier de sauvegarde des données caractérisant le Gravillon</summary>
    '''  <param name="inum">index du sable</param>  
    Private Sub Sauvegarde_DataGravillon(ByVal iNum As Integer)
        Dim verif As Boolean = True
        'lecture de ce qui est affiché dans l'onglet
        Call Lecture(iNum, verif)
        If verif = False Then Exit Sub
        Dim SaveFileDialog As New SaveFileDialog
        Try
            With SaveFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If
                .Title = "Enregistrer la sauvegarde des caractéristiques du gravillon sous ..."
                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                ' .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "xml" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Filter = "Fichiers xml (*.xml)|*.xml|Tous les fichiers (*.*)|*.*"
                .FilterIndex = 1
                .RestoreDirectory = True
                .ShowDialog()
                If .FileName <> "" Then Call SerializeSysKeys(.FileName, Gravillon.Item(iNum))   ''Sérialise les objets ecriture du gravillon complet
            End With
        Catch ex As Exception
            MessageBox.Show("Erreur dans l'écriture des données. Aucune données sauvegardées.", "Fichier de sauvegarde des données du gravillon", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

#Region "Bouton d'Aide"
    Private Sub BtnHlpTypeGravillon1_Click(sender As Object, e As EventArgs) Handles BtnHlpTypeGravillon1.Click, BtnHlpTypeGravillon2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 1
        frm1.Show()
    End Sub

    Private Sub btnHlpDensiteSeche_Click(sender As Object, e As EventArgs) Handles btnHlpDensiteSeche.Click, btnHlpDensiteSeche2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 7
        frm1.Show()
    End Sub

    Private Sub BtnHlpHumidite_Click(sender As Object, e As EventArgs) Handles BtnHlpHumidite.Click, BtnHlpHumidite2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 6
        frm1.Show()
    End Sub
    Private Sub BtnHlpQualite_Click(sender As Object, e As EventArgs) Handles BtnHlpQualite.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 25
        frm1.Show()
    End Sub
    Private Sub BtnHlpWabs_Click(sender As Object, e As EventArgs) Handles BtnHlpWabs.Click, BtnHlpWabs2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 31
        frm1.Show()
    End Sub
#End Region

    Private Sub BtnReinitialisationGravillon1_Click(sender As Object, e As EventArgs) Handles BtnReinitialisationGravillon1.Click
        Select Case Gravillon.Count
            Case 1
                Gravillon.Clear()
                Dim Gravillon1 As New clsGravillon
                Gravillon.Add(Gravillon1)
                Me.Text = "Laboratoire béton  :  [  ]"
            Case 2
                Dim Gravillon1 As New clsGravillon
                Gravillon.RemoveAt(0)
                Gravillon.Insert(0, Gravillon1)
        End Select
        Call Affichage_Tamis(0)
        Call Affichage_Gravillon(0, Gravillon.Item(0).Choix_mesureGranulo)
    End Sub

    Private Sub BtnReinitialisationGravillon2_Click(sender As Object, e As EventArgs) Handles BtnReinitialisationGravillon2.Click
        If Gravillon.Count = 2 Then
            Dim Gravillon1 As New clsGravillon
            Gravillon.RemoveAt(1)
            Gravillon.Insert(1, Gravillon1)
            Call Affichage_Gravillon(1, Gravillon.Item(1).Choix_mesureGranulo)
        End If

    End Sub

    Private Sub RbtnKg_CheckedChanged(sender As Object, e As EventArgs) Handles RbtnKg.CheckedChanged
        If RbtnKg.Checked = True Then
            LblPetrographie.Visible = False : CbPetrographie.Visible = False
            LblQualiteGranulat.Visible = False : CbQualiteGranulat.Visible = False
            TxtKg.Visible = True
            TxtKg.Focus()
        End If
    End Sub

    Private Sub RbtnKgGranulat_CheckedChanged(sender As Object, e As EventArgs) Handles RbtnKgGranulat.CheckedChanged
        If RbtnKgGranulat.Checked = True Then
            TxtKg.Visible = False
            Select Case Beton.Formulation
                Case 1 'Dreux-Gorisse
                    LblPetrographie.Visible = False : CbPetrographie.Visible = False
                    LblQualiteGranulat.Visible = True : CbQualiteGranulat.Visible = True
                Case 2 'Baron-Ollivier
                    LblPetrographie.Visible = True : LblPetrographie.Top = 66 ': LblPetrographie.Left = 282
                    CbPetrographie.Visible = True : CbPetrographie.Top = 63 ': CbPetrographie.Left = 361
                    LblQualiteGranulat.Visible = False : CbQualiteGranulat.Visible = False
            End Select

        End If
    End Sub


End Class