Imports System.IO
Imports System.Xml.Serialization
Imports System.Math
Public Class frmSable

    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.NbSable
                    Case 1
                        Call Affichage_Tamis(0)
                        Call Visibilite_Tamis2(False)
                    Case 2
                        Call Affichage_Tamis(0)
                        If Sable.Count > 1 Then
                            Call Visibilite_Tamis2(True)
                            Call Affichage_Tamis(1)
                        End If
                End Select
            Case 1 ' onglet caractéristique sable n°1
                Call Affichage_Sable(0, Sable.Item(0).Choix_mesureGranulo)
            Case 2 ' onglet caractéristique sable n°2
                If Sable.Count > 1 Then
                    Call Affichage_Sable(1, Sable.Item(1).Choix_mesureGranulo)
                End If
        End Select
    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.NbSable = 2 AndAlso Sable.Count > 1 Then Call Lecture_Tamis(1, Verif) : If Verif = False Then e.Cancel = True : Exit Sub

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

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

    Private Sub BtnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click
        Dim verif As Boolean = True
        For i = 1 To Beton.NbSable
            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_Sable(i - 1, verif)
            If verif = False Then Exit Sub
        Next
        Call VerificationCoherence(verif) : If verif = False Then Exit Sub
        Call Transfert_refus_tamisat(0)
        If Beton.NbSable = 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 sable renseigné</summary>
    '''  <param name="i">index du sable à vérifier, attention: l'index commence à 0</param>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub Verif_Sable(ByVal i As Integer, ByRef Verif As Boolean)
        Dim msg As String = String.Empty
        With Sable.Item(i)
            'Vérification que les modules de tamis correspondant au mf ont bien été cochés
            Select Case Beton.Formulation
                Case 1 'Dreux-Gorisse 5 - 2,5 et 1,25 mm ; 630 – 315 et 160μm 
                    If .Disponibilite_Tamis.Item(0.16) = False Then msg += "Le tamis de 160μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(0.315) = False Then msg += "Le tamis de 315μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(0.63) = False Then msg += "Le tamis de 630μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(1.25) = False Then msg += "Le tamis de 1,25mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(2.5) = False Then msg += "Le tamis de 2,5mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(5) = False Then msg += "Le tamis de 5mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                Case 2 'Baron-Ollivier 10 - 5 - 2,5 et 1,25 mm ; 630 – 315 et 160μm 
                    If .Disponibilite_Tamis.Item(0.16) = False Then msg += "Le tamis de 160μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(0.315) = False Then msg += "Le tamis de 315μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(0.63) = False Then msg += "Le tamis de 630μm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(1.25) = False Then msg += "Le tamis de 1,25mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(2.5) = False Then msg += "Le tamis de 2,5mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(5) = False Then msg += "Le tamis de 5mm n'a pas été renseigné." & Environment.NewLine : Verif = False
                    If .Disponibilite_Tamis.Item(10) = False Then msg += "Le tamis de 10mm n'a pas été renseigné." : Verif = False
            End Select
            If Verif = False Then
                Dim reponse As DialogResult
                reponse = MessageBox.Show("Sable n°" & (i + 1).ToString & " - Tamis pour module de finesse : " & Environment.NewLine & msg & "Validez-vous quand même ?(O/N)",
                                       "Module de vérification des données du sable", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                If reponse = Windows.Forms.DialogResult.Yes Then Verif = True
            End If
            'Vérification de la densité du sable
            'granulat courant suivant définition EN206-1 ce qui implique une masse volumique >2000kg/m3 et <3000kg/m3 déterminée selon l’EN 1097-6. Si la densité renseignée  pas entre ces 2 bornes, le logiciel affichera une erreur.
            If .Densite < 2 Then
                MessageBox.Show("Sable 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 sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                Verif = False
            End If
            If .Densite > 3 Then
                MessageBox.Show("Sable 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 sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                Verif = False
            End If
            'Vérification de la cohérence des données sur la teneur en eau du sable.
            If Beton.CompPondHumide = True Then
                If .Humidite > 0.19 Then
                    Dim reponse As DialogResult
                    reponse = MessageBox.Show("Sable n°" & (i + 1).ToString & " - Teneur en eau = " & (.Humidite * 100).ToString("#0.00") & " > 20% = Sable saturé en eau. Non conforme aux spécifications du logiciel." &
                                              Environment.NewLine & ". Validez-vous cette valeur ?", "Module de vérification des données du sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                    If reponse = Windows.Forms.DialogResult.No Then
                        If Verif = True Then Verif = False
                    Else
                        msg = ""
                        msg = "Sable n°" & (i + 1).ToString & " - Teneur en eau = " & (.Humidite * 100).ToString("#0.00") & " > 20% = Sable 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

    ''' <summary>Programme de verification des données sur les sables renseignées</summary>
    '''  <param name="verif">Renvoie FALSE si erreur dans la lecture</param>
    Private Sub VerificationCoherence(ByRef Verif As Boolean)
        Dim msg As String = String.Empty
        With Sable
            If .Count = 1 And Beton.NbSable = 2 Then
                MessageBox.Show("Nombre de sable(s) renseigné(s) = " & .Count.ToString("#0") & " <> nombre total de sable(s) entrant dans la formulation du béton = " & Beton.NbSable.ToString("#0") & Environment.NewLine & "Veuillez modifier vos données.",
                                        "Module de vérification de cohérence des données du sable", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Verif = False : Exit Sub
            End If
            For i = 1 To Beton.NbSable
                With .Item(i - 1)
                    'Traitement du module de finesse
                    If .Correcteur = False Then
                        .ModuleFinesse(.Choix_mesureGranulo, Beton.Formulation)
                        If .mf > 3.2 Then
                            msg = "Module de finesse : sable trop grossier, mf = " & .mf.ToString("#0.00") & "> 3,2"
                            MessageBox.Show(msg, "Module de vérification de cohérence des données du sable", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) : Verif = False : Exit Sub
                        ElseIf .mf < 1.8 Then
                            msg = "Module de finesse : sable trop fin, mf = " & .mf.ToString("#0.00") & "< 1,8"
                            MessageBox.Show(msg, "Module de vérification de cohérence des données du sable", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) : Verif = False : Exit Sub
                        ElseIf .mf > 2.85 Then
                            Dim Reponse As DialogResult
                            msg = "Module de finesse : sable un peu trop grossier, mf = " & .mf.ToString("#0.00") & Environment.NewLine & "La compacite du mélange granulaire ne sera pas satisfaisante." & Environment.NewLine &
                                  "Voulez-vous continuer?"
                            MessageBox.Show(msg, "Module de vérification de cohérence des données du sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                            If Reponse = DialogResult.No Then Verif = False : Exit Sub
                        ElseIf .mf < 2.15 Then
                            Dim Reponse As DialogResult
                            msg = "Module de finesse : sable un peu trop fin, mf = " & .mf.ToString("#0.00") & Environment.NewLine & "La compacite du mélange granulaire ne sera pas satisfaisante." & Environment.NewLine &
                                  "Voulez-vous continuer?"
                            MessageBox.Show(msg, "Module de vérification de cohérence des données du sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                            If Reponse = DialogResult.No Then Verif = False : Exit Sub
                        End If
                    End If
                    'Vérification du module de finesse cible
                    If i = 2 Then 'Sable n°2
                        If .mfCible < 2.45 OrElse .mfCible > 2.55 Then
                            Dim reponse As DialogResult
                            reponse = MessageBox.Show("Module de finesse cible éloigné de 2,5 = " & .mfCible.ToString("#0.00") & Environment.NewLine & ". Validez-vous cette valeur ?",
                                            "Module de vérification des données du sable", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
                            If reponse = DialogResult.No Then Verif = False
                        End If
                        Sable.Item(0).ModuleFinesse(Sable.Item(0).Choix_mesureGranulo, Beton.Formulation) : .ModuleFinesse(.Choix_mesureGranulo, Beton.Formulation)
                        If (.mfCible < Sable.Item(0).mf And .mfCible < .mf) OrElse (.mfCible > Sable.Item(0).mf And .mfCible > .mf) Then
                            msg = "Valeurs de mf sable 1 = " & Sable.Item(0).mf.ToString("#0.00") & " et mf sable 2 = " & .mf.ToString("#0.00") & " , incompatible avec la valeur de mf cible = " & .mfCible.ToString("#0.00")
                            Verif = False
                        End If
                    End If
                End With

            Next
        End With
        If Verif = False Then
            MessageBox.Show(msg, "Module de vérification des données du sable", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If

    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 TextNomSable_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextNomSable.Enter
        TextNomSable.SelectionStart = 0
        TextNomSable.SelectionLength = TextNomSable.Text.Length
    End Sub
    Private Sub TextNomSable2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextNomSable2.Enter
        TextNomSable2.SelectionStart = 0
        TextNomSable2.SelectionLength = TextNomSable2.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 TxtWabs_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtWabs.Enter
        TxtWabs.SelectionStart = 0
        TxtWabs.SelectionLength = TxtWabs.Text.Length
    End Sub
    Private Sub TxtWabs_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtWabs.KeyPress
        Call Gestion_Keypress(e, TxtWabs, True, False)
    End Sub
    Private Sub TxtWabs2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtWabs2.Enter
        TxtWabs2.SelectionStart = 0
        TxtWabs2.SelectionLength = TxtWabs2.Text.Length
    End Sub
    Private Sub TxtWabs2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtWabs2.KeyPress
        Call Gestion_Keypress(e, TxtWabs2, 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 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
    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 TxtMfCible_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtMfCible.Enter, TxtMfCible.Click
        TxtMfCible.SelectionStart = 0
        TxtMfCible.SelectionLength = TxtMfCible.Text.Length
    End Sub

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

    Private Sub TxtFines1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtFines1.KeyPress
        Call Gestion_Keypress(e, TxtFines1, True, False)
    End Sub
    Private Sub TxtFines2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtFines2.KeyPress
        Call Gestion_Keypress(e, TxtFines2, True, False)
    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 Sable.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 Sable.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 Sable.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 Sable.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
        If Sable.Count = 0 Then
            MessageBox.Show("Impossible d'afficher la courbe granulométrique, le logiciel ne détecte aucun sable.", "Module Bouton Granulo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            Exit Sub
        End If
        With Sable.Item(0)
            Select Case CbRefus.SelectedIndex
                Case 0 'refus
                    .ModuleFinesse(0, Beton.Formulation)
                Case 1 'refus cumulé g
                    .ModuleFinesse(1, Beton.Formulation)
                Case 2 'refus cumulé %
                    .ModuleFinesse(2, Beton.Formulation)
                Case 3 'tamisat cumulé g
                    .ModuleFinesse(3, Beton.Formulation)
                Case 4 ' tamisat cumulé %
                    .ModuleFinesse(4, Beton.Formulation)
            End Select
            .Affichage_CourbeGranulo = 1
            'pour n'afficher que la courbe du sable 1
            If Beton.NbSable = 2 AndAlso Sable.Count > 1 Then Sable.Item(1).Affichage_CourbeGranulo = 0
            If Gravillon.Count > 0 Then Gravillon.Item(0).Affichage_CourbeGranulo = 0
            If Beton.NbGravillon = 2 AndAlso Gravillon.Count > 1 Then Gravillon.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 Sable.Item(1)
            Select Case CbRefus2.SelectedIndex
                Case 0 'refus
                    .ModuleFinesse(0, Beton.Formulation)
                Case 1 'refus cumulé g
                    .ModuleFinesse(1, Beton.Formulation)
                Case 2 'refus cumulé %
                    .ModuleFinesse(2, Beton.Formulation)
                Case 3 'tamisat cumulé g
                    .ModuleFinesse(3, Beton.Formulation)
                Case 4 ' tamisat cumulé %
                    .ModuleFinesse(4, Beton.Formulation)
            End Select
            .Affichage_CourbeGranulo = 1
            'pour n'afficher que la courbe du sable 2
            Sable.Item(0).Affichage_CourbeGranulo = 0
            If Gravillon.Count > 0 Then Gravillon.Item(0).Affichage_CourbeGranulo = 0
            If Beton.NbGravillon = 2 AndAlso Gravillon.Count > 1 Then Gravillon.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 sables renseignées</summary>
    '''  <param name="i">index du sable</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 Sable.Item(i)
                    'identité du sable
                    If TextNomSable.Text <> "" Then .NomSable = TextNomSable.Text Else EP1.SetError(TextNomSable, "Aucune donnée") : msg += "Le nom du sable n'a pas été renseigné." & Environment.NewLine : verif = False
                    'Type de forme du sable
                    If RbtnConcasse1.Checked = True Then .Forme = 1 Else .Forme = 2
                    'Sable correcteur
                    If ChkbSableCorrecteur1.Checked = True Then .Correcteur = True Else .Correcteur = False
                    'densité sèche
                    If gestionderreur(TxtDensiteSeche, EP1) = True Then .Densite = CDbl(TxtDensiteSeche.Text) Else msg += "La valeur de la densité sèche du sable 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 sable 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 sable n'a pas été renseignée." & Environment.NewLine : verif = False
                        End If
                    End If
                    'classe granulaire: dmini
                    If gestionderreur(Textd, EP1) = True Then .ds = CDbl(Textd.Text) Else msg += "La valeur de d mini du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'classe granulaire: dmax
                    If gestionderreur(TextDm, EP1) = True Then .Dms = CDbl(TextDm.Text) Else msg += "La valeur de d maxi du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'Teneur en fines
                    If Beton.Formulation = 2 Then
                        If gestionderreur(TxtFines1, EP1) = True Then .TeneurFines = CDbl(TxtFines1.Text) / 100 Else msg += "La valeur de la teneur en fines du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    End If
                    'masse totale echantilon
                    If gestionderreur(TextMt, EP1) = True Then .Ms = CDbl(TextMt.Text) Else msg = "La masse totale du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'refus - Tamisat
                    Call LectureGranulo(i, verif)
                End With
            Case 1
                With Sable.Item(i)
                    'identité du sable
                    If TextNomSable2.Text <> "" Then .NomSable = TextNomSable2.Text Else EP1.SetError(TextNomSable2, "Aucune donnée") : msg += "Le nom du sable n'a pas été renseigné." & Environment.NewLine : verif = False
                    'type de forme du sable
                    If RbtnConcasse2.Checked = True Then .Forme = 1 Else .Forme = 2
                    'Sable correcteur
                    If ChkbSableCorrecteur2.Checked = True Then .Correcteur = True Else .Correcteur = False
                    'densité sèche
                    If gestionderreur(TxtDensiteSeche2, EP1) = True Then .Densite = CDbl(TxtDensiteSeche2.Text) Else msg += "La valeur de la densité sèche du sable 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 sable 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 sable n'a pas été renseignée." & Environment.NewLine : verif = False
                        End If
                    End If
                    'classe granulaire: dmini
                    If gestionderreur(Textd2, EP1) = True Then .ds = CDbl(Textd2.Text) Else msg += "La valeur de d mini du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'classe granulaire: dmax
                    If gestionderreur(TextDm2, EP1) = True Then .Dms = CDbl(TextDm2.Text) Else msg += "La valeur de d maxi du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'Teneur en fines
                    If Beton.Formulation = 2 Then
                        If gestionderreur(TxtFines2, EP1) = True Then .TeneurFines = CDbl(TxtFines2.Text) / 100 Else msg += "La valeur de la teneur en fines du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    End If
                    'masse totale echantillon
                    If gestionderreur(TextMt2, EP1) = True Then .Ms = CDbl(TextMt2.Text) Else msg = "La masse totale du sable n'a pas été renseignée." & Environment.NewLine : verif = False
                    'refus - Tamisat
                    Call LectureGranulo(i, verif)
                    'mf cible de l'assemblage des 2 sables
                    If gestionderreur(TxtMfCible, EP1) = True Then .mfCible = CDbl(TxtMfCible.Text) Else msg = "La valeur du module de finesse cible n'a pas été renseignée." & Environment.NewLine : verif = False
                End With
        End Select
        If verif = False Then
            MessageBox.Show("Erreur dans la lecture des données du sable n°" & (i + 1).ToString & "." & Environment.NewLine & msg, "Module de lecture des données du sable", 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 sable</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 Sable.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 Sable.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 frmSable_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            If Sable.Count = 1 Then
                Me.Text = "Caractéristiques du sable"
                TC1.TabPages.Remove(TbpSable2)
                Visibilite_Tamis2(False)
            Else
                Me.Text = "Caractéristiques des sables"
            End If
            With Sable.Item(0)
                Dim j As Integer
                If .Disponibilite_Tamis_Bool.Count = 23 Then
                    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 22 '23 tamis
                        .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 22
                                .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 1 'refus cumulé en g
                            .RefusCumule_g.Clear()
                            For j = 0 To 22
                                .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 2 'refus cumulé en %
                            .RefusCumule_Pourcent.Clear()
                            For j = 0 To 22
                                .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 3 'Tamisats cumulés en g
                            .TamisatCumule_g.Clear()
                            For j = 0 To 22
                                .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                        Case 4 'Tamisats cumulés en %
                            .TamisatCumule_Pourcent.Clear()
                            For j = 0 To 22
                                .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                            Next
                    End Select
                End If
            End With

            Call Affichage_Tamis(0)
            Call Affichage_Sable(0)

            If Sable.Count > 1 Then
                Visibilite_Tamis2(True)
                With Sable.Item(1)
                    Dim j As Integer
                    If .Disponibilite_Tamis_Bool.Count = 23 Then
                        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 22 '23 tamis
                            .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 22
                                    .Refus(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 1 'refus cumulé en g
                                .RefusCumule_g.Clear()
                                For j = 0 To 22
                                    .RefusCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 2 'refus cumulé en %
                                .RefusCumule_Pourcent.Clear()
                                For j = 0 To 22
                                    .RefusCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 3 'Tamisats cumulés en g
                                .TamisatCumule_g.Clear()
                                For j = 0 To 22
                                    .TamisatCumule_g(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                            Case 4 'Tamisats cumulés en %
                                .TamisatCumule_Pourcent.Clear()
                                For j = 0 To 22
                                    .TamisatCumule_Pourcent(toto(j)) = .Val_Tamisat_Refus.Item(j)
                                Next
                        End Select
                    End If
                End With
                Call Affichage_Tamis(1)
                Call Affichage_Sable(1)
                'Else
                '    'Affichage du mf cible de l'assemblage des 2 sables
                '    TxtMfCible.Text = Sable.Item(0).mfCible.ToString("#0.00") 'dispose de la même valeur et sert de valeur par défaut
            End If
            TC1.SelectedIndex = 0

        Catch ex As Exception
            MessageBox.Show("Erreur lors du chargement du formulaire:" & Environment.NewLine & "Exception: " & ex.Message & Environment.NewLine & ex.StackTrace, "Formulaire ", 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 Sable.Item(i)

            With .Disponibilite_Tamis
                Select Case i
                    Case 0
                        If .Item(0.063) = True Then ChkbMod19.Checked = True Else ChkbMod19.Checked = False
                        If .Item(0.08) = True Then ChkbMod20.Checked = True Else ChkbMod20.Checked = False
                        If .Item(0.1) = True Then ChkbMod21.Checked = True Else ChkbMod21.Checked = False
                        If .Item(0.125) = True Then ChkbMod22.Checked = True Else ChkbMod22.Checked = False
                        If .Item(0.16) = True Then ChkbMod23.Checked = True Else ChkbMod23.Checked = False
                        If .Item(0.2) = True Then ChkbMod24.Checked = True Else ChkbMod24.Checked = False
                        If .Item(0.25) = True Then ChkbMod25.Checked = True Else ChkbMod25.Checked = False
                        If .Item(0.315) = True Then ChkbMod26.Checked = True Else ChkbMod26.Checked = False
                        If .Item(0.4) = True Then ChkbMod27.Checked = True Else ChkbMod27.Checked = False
                        If .Item(0.5) = True Then ChkbMod28.Checked = True Else ChkbMod28.Checked = False
                        If .Item(0.63) = True Then ChkbMod29.Checked = True Else ChkbMod29.Checked = False
                        If .Item(0.8) = True Then ChkbMod30.Checked = True Else ChkbMod30.Checked = False
                        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
                    Case 1
                        If .Item(0.063) = True Then ChkbMod19_2.Checked = True Else ChkbMod19_2.Checked = False
                        If .Item(0.08) = True Then ChkbMod20_2.Checked = True Else ChkbMod20_2.Checked = False
                        If .Item(0.1) = True Then ChkbMod21_2.Checked = True Else ChkbMod21_2.Checked = False
                        If .Item(0.125) = True Then ChkbMod22_2.Checked = True Else ChkbMod22_2.Checked = False
                        If .Item(0.16) = True Then ChkbMod23_2.Checked = True Else ChkbMod23_2.Checked = False
                        If .Item(0.2) = True Then ChkbMod24_2.Checked = True Else ChkbMod24_2.Checked = False
                        If .Item(0.25) = True Then ChkbMod25_2.Checked = True Else ChkbMod25_2.Checked = False
                        If .Item(0.315) = True Then ChkbMod26_2.Checked = True Else ChkbMod26_2.Checked = False
                        If .Item(0.4) = True Then ChkbMod27_2.Checked = True Else ChkbMod27_2.Checked = False
                        If .Item(0.5) = True Then ChkbMod28_2.Checked = True Else ChkbMod28_2.Checked = False
                        If .Item(0.63) = True Then ChkbMod29_2.Checked = True Else ChkbMod29_2.Checked = False
                        If .Item(0.8) = True Then ChkbMod30_2.Checked = True Else ChkbMod30_2.Checked = False
                        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
                End Select

            End With
        End With
    End Sub

    ''' <summary>Affichage des tamis pour le sable 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 ChkbMod19_2.Visible = True Else ChkbMod19_2.Visible = False
        If Affiche = True Then ChkbMod20_2.Visible = True Else ChkbMod20_2.Visible = False
        If Affiche = True Then ChkbMod21_2.Visible = True Else ChkbMod21_2.Visible = False
        If Affiche = True Then ChkbMod22_2.Visible = True Else ChkbMod22_2.Visible = False
        If Affiche = True Then ChkbMod23_2.Visible = True Else ChkbMod23_2.Visible = False
        If Affiche = True Then ChkbMod24_2.Visible = True Else ChkbMod24_2.Visible = False
        If Affiche = True Then ChkbMod25_2.Visible = True Else ChkbMod25_2.Visible = False
        If Affiche = True Then ChkbMod26_2.Visible = True Else ChkbMod26_2.Visible = False
        If Affiche = True Then ChkbMod27_2.Visible = True Else ChkbMod27_2.Visible = False
        If Affiche = True Then ChkbMod28_2.Visible = True Else ChkbMod28_2.Visible = False
        If Affiche = True Then ChkbMod29_2.Visible = True Else ChkbMod29_2.Visible = False
        If Affiche = True Then ChkbMod30_2.Visible = True Else ChkbMod30_2.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
    End Sub

    ''' <summary>Lecture des données dans l'onglet Tamis</summary>
    '''  <param name="j">index du sable, attention: l'index commence à 0</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 Sable.Item(j).Disponibilite_Tamis
            Select Case j
                Case 0
                    If ChkbMod19.Checked = True Then .Item(0.063) = True : i += 1 Else .Item(0.063) = False
                    If ChkbMod20.Checked = True Then .Item(0.08) = True : i += 1 Else .Item(0.08) = False
                    If ChkbMod21.Checked = True Then .Item(0.1) = True : i += 1 Else .Item(0.1) = False
                    If ChkbMod22.Checked = True Then .Item(0.125) = True : i += 1 Else .Item(0.125) = False
                    If ChkbMod23.Checked = True Then .Item(0.16) = True : i += 1 Else .Item(0.16) = False
                    If ChkbMod24.Checked = True Then .Item(0.2) = True : i += 1 Else .Item(0.2) = False
                    If ChkbMod25.Checked = True Then .Item(0.25) = True : i += 1 Else .Item(0.25) = False
                    If ChkbMod26.Checked = True Then .Item(0.315) = True : i += 1 Else .Item(0.315) = False
                    If ChkbMod27.Checked = True Then .Item(0.4) = True : i += 1 Else .Item(0.4) = False
                    If ChkbMod28.Checked = True Then .Item(0.5) = True : i += 1 Else .Item(0.5) = False
                    If ChkbMod29.Checked = True Then .Item(0.63) = True : i += 1 Else .Item(0.63) = False
                    If ChkbMod30.Checked = True Then .Item(0.8) = True : i += 1 Else .Item(0.8) = False
                    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
                    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
                    Sable.Item(0).Disponibilite_Tamis_Bool.Clear() 'par précaution
                    For i1 = 0 To .Count - 1
                        Sable.Item(0).Disponibilite_Tamis_Bool.Add(.Item(Kvp(i1)))
                    Next
                Case 1
                    If ChkbMod19_2.Checked = True Then .Item(0.063) = True : i += 1 Else .Item(0.063) = False
                    If ChkbMod20_2.Checked = True Then .Item(0.08) = True : i += 1 Else .Item(0.08) = False
                    If ChkbMod21_2.Checked = True Then .Item(0.1) = True : i += 1 Else .Item(0.1) = False
                    If ChkbMod22_2.Checked = True Then .Item(0.125) = True : i += 1 Else .Item(0.125) = False
                    If ChkbMod23_2.Checked = True Then .Item(0.16) = True : i += 1 Else .Item(0.16) = False
                    If ChkbMod24_2.Checked = True Then .Item(0.2) = True : i += 1 Else .Item(0.2) = False
                    If ChkbMod25_2.Checked = True Then .Item(0.25) = True : i += 1 Else .Item(0.25) = False
                    If ChkbMod26_2.Checked = True Then .Item(0.315) = True : i += 1 Else .Item(0.315) = False
                    If ChkbMod27_2.Checked = True Then .Item(0.4) = True : i += 1 Else .Item(0.4) = False
                    If ChkbMod28_2.Checked = True Then .Item(0.5) = True : i += 1 Else .Item(0.5) = False
                    If ChkbMod29_2.Checked = True Then .Item(0.63) = True : i += 1 Else .Item(0.63) = False
                    If ChkbMod30_2.Checked = True Then .Item(0.8) = True : i += 1 Else .Item(0.8) = False
                    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
                    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
                    Sable.Item(1).Disponibilite_Tamis_Bool.Clear() 'par précaution
                    For i1 = 0 To .Count - 1
                        Sable.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 du module de finesse.", "Module Lecture Onglet Tamis", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
    End Sub

    ''' <summary>Affichage des données dans l'onglet Sable</summary>
    '''  <param name="j">= index du sable</param>
    '''  <param name="CbrefusIndex">= index du CbRefus pour validation entre refus, refus cumulé en g, refus cumulé en %, ...</param> 
    Private Sub Affichage_Sable(ByVal j As Integer, Optional ByVal CbrefusIndex As Integer = 0) 'Optional ByVal fichierData As Boolean = False)
        With Sable.Item(j)
            Select Case j
                Case 0
#Region "Onglet Sable n°1"
                    'identité du sable
                    TextNomSable.Text = .NomSable
                    'type de production du sable
                    Select Case .Forme
                        Case 1
                            RbtnConcasse1.Checked = True
                        Case 2
                            RbtnRoule1.Checked = True
                    End Select
                    'Sable correcteur
                    If .Correcteur = True Then ChkbSableCorrecteur1.Checked = True Else ChkbSableCorrecteur1.Checked = False
                    '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
                            LblWabs1.Visible = True : LblWabs1Pourcent.Visible = True : BtnHlpWabs.Visible = True : TxtWabs.Visible = True
                            TxtWabs.Text = (.Wabs * 100).ToString("#0.0")
                        Else
                            LblWabs1.Visible = False : LblWabs1Pourcent.Visible = False : BtnHlpWabs.Visible = False : TxtWabs.Visible = False
                        End If
                    Else
                        LblHumidite1.Visible = False : LblHumidite1Pourcent.Visible = False : BtnHlpHumidite.Visible = False : TxtHumidite.Visible = False
                        LblWabs1.Visible = False : LblWabs1Pourcent.Visible = False : BtnHlpWabs.Visible = False : TxtWabs.Visible = False
                    End If
                    'masse totale echantilon
                    TextMt.Text = .Ms.ToString("#0")
                    'classe granulaire
                    If Abs(.ds - Truncate(.ds)) > 0.00001 Then Textd.Text = .ds.ToString("#0.00") Else Textd.Text = .ds.ToString("#0") 'l'affichage sera plus jolie!
                    If Abs(.Dms - Truncate(.Dms)) > 0.00001 Then TextDm.Text = .Dms.ToString("#0.00") Else TextDm.Text = .Dms.ToString("#0")   'l'affichage sera plus jolie!
                    'Teneur en fines
                    Select Case Beton.Formulation
                        Case 1 'Dreux-Gorisse
                            LblFines1.Visible = False : TxtFines1.Visible = False : LblFinesPourcent1.Visible = False : RbtnHlpFines1.Visible = False
                        Case 2 'Baron-Ollivier
                            LblFines1.Visible = True : TxtFines1.Visible = True : LblFinesPourcent1.Visible = True : RbtnHlpFines1.Visible = True
                            TxtFines1.Text = (.TeneurFines * 100).ToString("#0.00")
                    End Select
                    '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 "Sable n°2"
                    'identité du sable
                    TextNomSable2.Text = .NomSable
                    'type de production du sable
                    Select Case .Forme
                        Case 1
                            RbtnConcasse2.Checked = True
                        Case 2
                            RbtnRoule2.Checked = True
                    End Select
                    'Sable correcteur
                    If .Correcteur = True Then ChkbSableCorrecteur2.Checked = True Else ChkbSableCorrecteur2.Checked = False
                    '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
                    'masse totale echantilon
                    TextMt2.Text = .Ms.ToString("#0")
                    'classe granulaire
                    If Abs(.ds - Truncate(.ds)) > 0.00001 Then Textd2.Text = .ds.ToString("#0.00") Else Textd2.Text = .ds.ToString("#0") 'l'affichage sera plus jolie!
                    If Abs(.Dms - Truncate(.Dms)) > 0.00001 Then TextDm2.Text = .Dms.ToString("#0.00") Else TextDm2.Text = .Dms.ToString("#0")   'l'affichage sera plus jolie!
                    'Teneur en fines
                    Select Case Beton.Formulation
                        Case 1 'Dreux-Gorisse
                            LblFines2.Visible = False : TxtFines2.Visible = False : LblFinesPourcent2.Visible = False : RbtnHlpFines2.Visible = False
                        Case 2 'Baron-Ollivier
                            LblFines2.Visible = True : TxtFines2.Visible = True : LblFinesPourcent2.Visible = True : RbtnHlpFines2.Visible = True
                            TxtFines2.Text = (.TeneurFines * 100).ToString("#0.00")
                    End Select
                    'Affichage du mode de référence de la granulométrie
                    CbRefus2.SelectedIndex = CbrefusIndex
                    CbRefus2.Text = CbRefus2.SelectedItem.ToString

#Region "Affichage de la granulométrie"
                    '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

                    'Affichage du mf cible de l'assemblage des 2 sables
                    TxtMfCible.Text = .mfCible.ToString("#0.00")
#End Region
            End Select
        End With
    End Sub

#Region "Sauvegarde des données granulométriques sables 1 et 2"
    Private Sub BtnGranuloSauvegardeSable_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 sable 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_Sable(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 sable 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_Sable(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 Sables 1 et 2</summary>
    '''  <param name="i">= index du sable</param>
    '''  <param name="Filename">nom du fichier de sauvagarde</param>
    '''  <param name="Verif">renvoie FALSE si pb</param>
    Private Sub Ecriture_Fichier_Sable(ByVal i As Integer, ByVal Filename As String, ByRef Verif As Boolean)
        Dim myStreamWriter As StreamWriter
        Try
            myStreamWriter = File.CreateText(Filename)
            With Sable.Item(i)
                'caractéristiques du sable
                myStreamWriter.WriteLine(.Ms.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 sable n°" & (i + 1).ToString & Environment.NewLine &
                                        "Le choix de la mesure granulométrique n'a pas pu être identifié.", "Module Ecriture_Fichier_Sable", 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 sable n°" & (i + 1).ToString & Environment.NewLine & exc.Message & exc.StackTrace,
                            "Module Ecriture_Fichier_Sable", 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)" : LvTamis.Items(0).SubItems(0).Text = "Refus (g)" 'Refus
        If CbRefus.SelectedIndex = 1 Then LblRefusUnite.Text = "(g)" : LvTamis.Items(0).SubItems(0).Text = "Refus cumulé  (g)" ' Refus cumulé en g
        If CbRefus.SelectedIndex = 2 Then LblRefusUnite.Text = "(%)" : LvTamis.Items(0).SubItems(0).Text = "Refus cumulé  (%)" ' Refus cumulé en %
        If CbRefus.SelectedIndex = 3 Then LblRefusUnite.Text = "(g)" : LvTamis.Items(0).SubItems(0).Text = "Tamisât cumulé (g)" ' Tamisat cumulé en g
        If CbRefus.SelectedIndex = 4 Then LblRefusUnite.Text = "(%)" : LvTamis.Items(0).SubItems(0).Text = "Tamisât cumulé (%)" ' Tamisat cumulé en %
    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(Sable.Item(0).Disponibilite_Tamis.Count - 1) As Double
                        Dim i As Integer = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In Sable.Item(0).Disponibilite_Tamis
                            i += 1 : dd(i) = kvp.Key
                        Next
                        For i = 0 To Sable.Item(0).Disponibilite_Tamis.Count - 1
                            Sable.Item(0).Disponibilite_Tamis(dd(i)) = False
                        Next
                        Call Lecture_DataGranulo(0, .FileName, CbRefusIndex, Verif)
                        If Verif = True Then
                            Call Affichage_Tamis(0)
                            Sable.Item(0).Choix_mesureGranulo = CbRefusIndex
                            Call Affichage_Sable(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(Sable.Item(1).Disponibilite_Tamis.Count - 1) As Double
                        Dim i As Integer = -1
                        For Each kvp As KeyValuePair(Of Double, Boolean) In Sable.Item(1).Disponibilite_Tamis
                            i += 1 : dd(i) = kvp.Key
                        Next
                        For i = 0 To Sable.Item(1).Disponibilite_Tamis.Count - 1
                            Sable.Item(1).Disponibilite_Tamis(dd(i)) = False
                        Next
                        Call Lecture_DataGranulo(1, .FileName, CbRefusIndex, Verif)
                        If Verif = True Then
                            Call Affichage_Tamis(1)
                            Sable.Item(1).Choix_mesureGranulo = CbRefusIndex
                            Call Affichage_Sable(1, CbRefusIndex) 'True)
                            ' Me.Text = "Calcul de pieux suivant essais pressiométriques : [ " & NomAffaire.ToString & " ]"
                        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_DataGranulo(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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                        Else
                            If Double.TryParse(titi(1), Sable.Item(i).Ms) = 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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                            Else
                                Sable.Item(i).Ms = 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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                        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_DataGranulo()", 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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : 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_DataGranulo()", 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 Sable.Item(i).Disponibilite_Tamis
                                    If kvp.Key = Tamis Then
                                        Sable.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_DataGranulo()", 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_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 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
                                        Sable.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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Sable.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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Sable.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_DataGranulo()", MessageBoxButtons.OK, MessageBoxIcon.Information) : Verif = False : Exit Do
                                    Else
                                        Sable.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_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é % 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
                                        Sable.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 sable n°" & (i + 1).ToString & Environment.NewLine & "Exception: " & ex.Message & ex.StackTrace, "Private Sub Lecture_DataGranulo()", 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 BtnChargerSable1_Click(sender As Object, e As EventArgs) Handles BtnChargerSable1.Click
        Call Lecture_DataSable(0)
    End Sub
    Private Sub BtnChargerSable2_Click(sender As Object, e As EventArgs) Handles BtnChargerSable2.Click
        Call Lecture_DataSable(1)
    End Sub

    ''' <summary>Lecture du fichier de sauvegarde des données caractérisant le sable</summary>
    '''  <param name="inum">index du sable</param>  
    Private Sub Lecture_DataSable(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_sable(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 Sable1 As New clsSable
                    Call DeSerializeSysKeysInterne(.FileName, Sable1, Sable1)
                    Select Case iNum
                        Case 0
                            If Sable.Count = 0 Then
                                Sable.Add(Sable1)
                            Else
                                Sable.Item(iNum) = Sable1
                            End If
                        Case 1
                            If Sable.Count = 1 Then
                                Sable.Add(Sable1)
                            Else
                                Sable.Item(iNum) = Sable1
                            End If
                    End Select
                    Call Affectation(iNum)
                    If Verif = False Then
                        Exit Sub
                    Else
                        Select Case Beton.NbSable
                            Case 1
                                Call Affichage_Tamis(0)
                                Call Visibilite_Tamis2(False)
                                Call Affichage_Sable(0, Sable.Item(0).Choix_mesureGranulo)' onglet caractéristique sable n°1
                            Case 2
                                Call Affichage_Tamis(0)
                                Call Affichage_Sable(0, Sable.Item(0).Choix_mesureGranulo) ' onglet caractéristique sable n°1
                                If Sable.Count > 1 Then
                                    Call Visibilite_Tamis2(True)
                                    Call Affichage_Tamis(1)
                                    Call Affichage_Sable(1, Sable.Item(1).Choix_mesureGranulo) ' onglet caractéristique sable 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 sable n°" & (iNum + 1).ToString & Environment.NewLine & Environment.NewLine & "Erreur: " & ex.Message, "Module Lecture_DataSable", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    ''' <summary>Lecture du fichier de sauvegarde des données caractérisant le sable</summary>
    '''  <param name="Path">Chemin d'accès</param>
    '''  <param name="Objet">Objet à désérialiser</param>
    '''  <param name="Sable1">pour affectation dans un objet Sable</param>
    Private Sub DeSerializeSysKeysInterne(ByVal Path As String, ByVal Objet As Object, ByRef Sable1 As clsSable)
        Call LoadXmlData1(Path, Objet)
        Sable1 = CType(Objet, clsSable)
    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 sable</summary>
    '''  <param name="iNum">index du sable</param>  
    Private Sub Affectation(ByVal iNum As Integer)
        With Sable.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 BtnSauvegardeSable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSauvegardeSable.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_DataSable(0)
    End Sub

    Private Sub BtnSauvegardeSable2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSauvegardeSable2.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_DataSable(1)
    End Sub

    ''' <summary>Transfert des données du Dictionary vers le List(of) caractérisant le sable</summary>
    '''  <param name="iNum">index du sable</param>  
    Private Sub Transfert_refus_tamisat(ByVal iNum As Integer)
        With Sable.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 sable</summary>
    '''  <param name="inum">index du sable</param>  
    Private Sub Sauvegarde_DataSable(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 sable 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, Sable.Item(iNum))   ''Sérialise les objets ecriture du sable 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 sable", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

#Region "Bouton d'Aide"

    Private Sub BtnHlpTamis_Click(sender As Object, e As EventArgs) Handles BtnHlpTamis.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 16
        frm1.Show()
    End Sub

    Private Sub BtnHlpForme1_Click(sender As Object, e As EventArgs) Handles BtnHlpForme1.Click, btnHlpForme2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 1
        frm1.Show()
    End Sub
    Private Sub BtnHlpCorrecteur_Click(sender As Object, e As EventArgs) Handles BtnHlpCorrecteur1.Click, BtnHlpCorrecteur2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 36
        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 = 5
        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 = 4
        frm1.Show()
    End Sub

    Private Sub RbtnHlpFines_Click(sender As Object, e As EventArgs) Handles RbtnHlpFines1.Click, RbtnHlpFines2.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 26
        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 = 30
        frm1.Show()
    End Sub
#End Region

    Private Sub BtnReinitialisationSable1_Click(sender As Object, e As EventArgs) Handles BtnReinitialisationSable1.Click
        Select Case Sable.Count
            Case 1
                Sable.Clear()
                Dim Sable1 As New clsSable
                Sable.Add(Sable1)
                Me.Text = "Laboratoire béton  :  [  ]"
            Case 2
                Dim Sable1 As New clsSable
                Sable.RemoveAt(0)
                Sable.Insert(0, Sable1)
        End Select
        Call Affichage_Tamis(0)
        Call Affichage_Sable(0, Sable.Item(0).Choix_mesureGranulo)
    End Sub

    Private Sub BtnReinitialisationSable2_Click(sender As Object, e As EventArgs) Handles BtnReinitialisationSable2.Click

        If Sable.Count = 2 Then
            Dim Sable1 As New clsSable
            Sable.RemoveAt(1)
            Sable.Insert(1, Sable1)
            Call Affichage_Sable(1, Sable.Item(1).Choix_mesureGranulo)
        End If

    End Sub


End Class