Overblog
Suivre ce blog Administration + Créer mon blog
20 octobre 2007 6 20 /10 /octobre /2007 16:55

Voici donc la nouvelle version de l'utilitaire "LiveBox AutoReboot" dans sa version 2.

Vous pouvez l'installer à partir de cette page :

http://cyrilhome.over-blog.net/pages/LiveBox_AutoReboot-33442.html

Cet utilitaire permet de vérifier si la LiveBox est connectée à Internet. Il ne fonctionne qu'avec la LiveBox Sagem qui accepte les commandes Telnet au contraire du model Inventel.

Partager cet article
Repost0
16 octobre 2007 2 16 /10 /octobre /2007 20:49

Cette fonction permet d'obtenir les adresses IP d'un hôte donné.

Cette fonction nécessite l'import du namespace System.Net et System.Text.

 

Code :

Private Function GetIP(ByVal hostName As String) As String
        Dim localHost As String
        Dim IPHEntry As IPHostEntry
        Dim IPAdd() As IPAddress

        localHost = Dns.GetHostName()

        IPHEntry = Dns.GetHostEntry(hostName)

        IPAdd = IPHEntry.AddressList

        Dim strIp As New StringBuilder

        For i As Integer = 0 To IPAdd.GetUpperBound(0)
            strIp.Append(String.Format("IP Address {0}: {1} ", i, IPAdd(i).ToString) & vbCrLf)
        Next

        Return strIp.ToString
  End Function

Partager cet article
Repost0
13 octobre 2007 6 13 /10 /octobre /2007 15:42

Il est parfois nécessaire de récupérer le champ UserId pour, par exemple, l'insérer dans une autre table pour créer une relation.

Voici comment procéder :

Code :

' On verifie que l'utilisateur est identifié

If My.User.IsAuthenticated Then
           ' on récupère les données de l'utilisateur

            Dim mu As MembershipUser = Membership.GetUser()
            Dim key As Guid

            ' On récupère le Guid du champ UserId
            key = mu.ProviderUserKey
End If

Partager cet article
Repost0
30 septembre 2007 7 30 /09 /septembre /2007 10:48

Pour s'assurer que votre application n'a été lancé qu'une fois, vous devez parcourir les processus en cours pour vérifier que votre application ne s'y trouve pas déjà .

Tout d'abord vous devez faire un Imports System.Management.

Code :


        Dim Process As New ManagementObjectSearcher("SELECT * FROM Win32_Process") 'Lecture des process
        Dim info As ManagementObject
        Dim stock As String
        Dim vrs As Integer

       ' Récupération des informations sur l'application
        Dim MyNameApp As New FileInfo(Application.ExecutablePath) ' où se trouve le programme
        Dim SingApp As FileVersionInfo = FileVersionInfo.GetVersionInfo(MyNameApp.Name) 'on récupère la version

        For Each info In Process.Get
            stock = info("Caption").ToString()
            If stock = SingApp.OriginalFilename.ToString() Then
                vrs = vrs + 1
                If vrs > 1 Then
                    MsgBox("L'application '" & MyNameApp.Name & "' est déjà lancée !", MsgBoxStyle.Critical)
                    End
                End If
            End If
        Next

Partager cet article
Repost0
30 septembre 2007 7 30 /09 /septembre /2007 10:39

Il est parfois nécessaire de redémarrer une application, suite  à une mise à jour ou une erreur critique par exemple. Une seule ligne suffit pour réaliser cette action :

Code :

System.Windows.Forms.Application.Restart()

Partager cet article
Repost0
27 septembre 2007 4 27 /09 /septembre /2007 14:58

Il est souvent préférable de mettre une image d'aperçu réduite dans une base de donnée, plutôt que l'image originale afin de ne pas alourdir la base de donnée.

Voici la méthode qui permet de retourner le "Thumbnail" d'une image :

Code :

Public Function ImageToByteArrayThumbnail(ByVal file As String, ByVal dWidth As Integer, ByVal dHeight As Integer) As Byte()
        Dim isoScalar As Decimal
        Dim dstWidth As Integer = dWidth
        Dim srcWidth As Integer
        Dim dstHeight As Integer = dHeight
        Dim srcHeight As Integer
        Dim newWidth As Integer
        Dim newHeight As Integer

        Dim myOriginalImage As Image = Image.FromFile(file)
        srcWidth = myOriginalImage.Size.Width
        srcHeight = myOriginalImage.Size.Height

        isoScalar = CDec(Math.Min((dstWidth / srcWidth), (dstHeight / srcHeight)))
        newWidth = CInt(isoScalar * srcWidth)
        newHeight = CInt(isoScalar * srcHeight)

        Dim myThumbImage As New Bitmap(myOriginalImage.GetThumbnailImage(newWidth, newHeight, New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback), IntPtr.Zero))

        Dim myMemoryStream As New MemoryStream
        myThumbImage.Save(myMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)

        Return myMemoryStream.ToArray
    End Function

Pour enregistrer cette "petite image" d'aperçu dans votre base de donnée, il suffit de faire :

Code :

row("thImage") = ImageToByteArrayThumbnail(file, 80, 80)

row("cheminImage") = file

La variable file contient, biensur, le chemin d'accès de l'image originale.

Partager cet article
Repost0
26 septembre 2007 3 26 /09 /septembre /2007 19:04

Il existe biensur plusieurs façons de procéder mais j'affectionne particulièrement celle-ci.

 

Code :

Public ds as New Dataset

Public Sub FillDataset()

GetDatabaseSchema()
        For Each dt As DataTable In ds.Tables
            FillTable(dt)
       Next

End Sub

Public Sub GetDatabaseSchema()
        Dim dtTableName As New DataTable("Tables")

        Using con As New SqlConnection(My.Settings.dbHcProspectionConnectionString)
            Dim Command As New SqlCommand
            Command = con.CreateCommand
            Command.CommandText = "select table_name as Name from INFORMATION_SCHEMA.Tables where TABLE_TYPE ='BASE TABLE'"

            con.Open()

           'on charge dans une datatable la liste des tables de la base de donnée

            dtTableName.Load(Command.ExecuteReader(CommandBehavior.CloseConnection))

            Dim tableName As String = Nothing

       'on récupère le schema de chaque table  

        For Each row As DataRow In dtTableName.Rows
                tableName = row("Name").ToString
                Using da As New SqlDataAdapter("SELECT * FROM " & tableName, con)
                    da.FillSchema(ds, SchemaType.Source, tableName)
                End Using
            Next
            con.Close()
        End Using
End Sub

Public Sub FillTable(ByVal dt As DataTable)
        Using con As New SqlConnection(My.Settings.dbHcProspectionConnectionString)
            Using da As New SqlDataAdapter("SELECT * FROM " & dt.TableName, con)
                da.Fill(ds, dt.TableName)
            End Using
        End Using
End Sub

Il ne vous reste plus qu'à appeller la méthode FillDataset pour charger les données ou GetDatabaseSchema pour ne charger que le schema de la base de données dans le dataset.

Partager cet article
Repost0
26 septembre 2007 3 26 /09 /septembre /2007 10:30

Le séparateur numérique n'étant pas le même en france que dans les pays anglosaxons, il est nécessaire de filter la saisie des chiffres décimaux afin de transformer les "." (point) en "," (virgule).

Pour cet exemple, nous allons utiliser un DataGridView que l'on appellera dgvTarifs et dont nous allons gérer l'événement EditingControlShowing. Nous ne filtrerons la saisie que sur 2 colonnnes : coefTarif et prixVenteHT

 

Code :

Private Sub dgvTarifs_EditingControlShowing(ByVal sender As Object, ByVal e As  System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvTarifs.EditingControlShowing

        ' on récupère le control TextBox de la cellule qui est édité       

        Dim voControl As DataGridViewTextBoxEditingControl = Nothing voControl = CType(e.Control, DataGridViewTextBoxEditingControl)

                    Select Case Me.dgvTarifs.Columns(dgvTarifs.CurrentCell.ColumnIndex).Name
               ' si la colonne qui est éditée est coefTarif ou prixVenteHT alors on gère l'événement KeyPress du TextBox            

               Case "coefTarif", "prixVenteHT"

                   RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress

                   AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                Case Else
                    RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
            End Select
  End Sub

    Private Sub EditingControl_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)

       ' on accepte que les caractères numériques, le point, ou la virgule       

       e.Handled = Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or e.KeyChar = "." Or e.KeyChar = ",")

       ' on récupère le texte du TextBox

        Dim txt As String = CType(sender, DataGridViewTextBoxEditingControl).Text

        ' on s'assure que le point ou la virgule n'a été tapé qu'une fois

        If (InStr(txt, ".") > 0 Or InStr(txt, ",") > 0) And (e.KeyChar = "." Or e.KeyChar = ",") Then
            e.KeyChar = Nothing
        Else
           ' on remplace le point par une virgule ou la virgule par un point en fonction du séparateur décimal utilisé dans la culture en cours

            Dim vsDecimalSeparator As Char
            vsDecimalSeparator = CChar(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator)

            If vsDecimalSeparator <> "." And e.KeyChar = "." Then
                e.KeyChar = vsDecimalSeparator
            End If
        End If

    End Sub

Partager cet article
Repost0
21 septembre 2007 5 21 /09 /septembre /2007 14:26

Pour cet exemple, nous allons prendre 3 tables dans une base de données :

Table Coureurs ayant les champs suivants :

  • pkCoureur (clef primaire GUID)
  • nomCoureur

Table Courses ayant les champs suivants :

  • pkCourse (clef primaire GUID)
  • nomCourse

Table CoureursCourses ayant les champs suivants :

  • pkCoureurCourse (clef primaire GUID)
  • fkCourse (clef étrangère GUID)
  • fkCoureur (clef étrangère GUID)

La table CoureursCourses permet de faire la relation entre les courses et les coureurs, ainsi, un coureur peut participer à plusieurs courses et une course peut être courue par plusieurs coureurs. Nous avons donc une relation de plusieurs à plusieurs.

Nous allons créer une fenêtre frmCourses dand laquelle nous allons mettre 2 DataGridView (dgvCourses et dgvCoureurs).

Voici comment procéder pour afficher les coureurs qui sont inscrit à une course :

Code :

Imports System.Data.SqlClient
Imports system.ComponentModel
Imports System.Text

Public Class frmCourses
    Private bsCourses As BindingSource
    Private bsCoureurs As BindingSource
    Private ds As DataSet

    Public Sub New()

        InitializeComponent()

       ' charger les données
        LoadData()

        ' Lier les datagridview aux bindingsources
        Me.dgvCoureurs.DataSource = bsCoureurs
        Me.dgvCourses.DataSource = bsCourses

        ' Gérer l'événement de changement de position de bsCourses
        AddHandler bsCourses.PositionChanged, AddressOf bsCourses_OnPositionChanged

    End Sub


    Private Sub frmCourses_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       ' on filtre les coureurs au chargement
        Me.FiltrerCoureurs()
    End Sub

    Private Sub LoadData()
       ' charger les données dans le dataset
        ds = New DataSet
        Using con As New SqlConnection(My.Settings.dbCoursesConnectionString)
            Using da As New SqlDataAdapter("SELECT * FROM Courses", con)
                da.Fill(ds, "Courses")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM Coureurs", con)
                da.Fill(ds, "Coureurs")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM CoureursCourses", con)
                da.Fill(ds, "CoureursCourses")
            End Using
        End Using

        ' Créer les relations
        Dim relation As DataRelation

        relation = New DataRelation("relationCoureurs_CoureursCourses", _
                                           ds.Tables("Coureurs").Columns("pkCoureur"), _
                                           ds.Tables("CoureursCourses").Columns("fkCoureur"))
        Me.ds.Relations.Add(relation)

        relation = New DataRelation("relationCourses_CoureursCourses", _
                                                   ds.Tables("Courses").Columns("pkCourse"), _
                                                   ds.Tables("CoureursCourses").Columns("fkCourse"))
        Me.ds.Relations.Add(relation)

        ' Bind les bindingsource aux données
        bsCourses = New BindingSource
        bsCourses.DataSource = ds
        bsCourses.DataMember = "Courses"

        bsCoureurs = New BindingSource
        bsCoureurs.DataSource = ds
        bsCoureurs.DataMember = "Coureurs"

    End Sub

    Private Sub bsCourses_OnPositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        ' Filtrer les coureurs pour la course courante
        Me.FiltrerCoureurs()
    End Sub

    Private Sub FiltrerCoureurs()
        ' on vérifie qu'il y a bien au moins une course
        If ds.Tables("Courses").Rows.Count > 0 Then
            Dim strFilter As New StringBuilder
           ' on récupère la clef primaire de la course courante
            Dim pkCourse As String = CType(bsCourses.Current, DataRowView).Item("pkCourse").ToString

           ' on crée le filtre pour les coureurs
            For Each row As DataRow In ds.Tables("CoureursCourses").Rows
                If row("fkCourse").ToString = pkCourse Then
                    If strFilter.Length > 0 Then
                        strFilter.Append(" OR ")
                    End If
                    strFilter.Append("pkCoureur='" & row("fkCoureur").ToString & "'")
                End If
            Next

            If strFilter.Length > 0 Then
               ' filtrer les coureurs qui font partie de la course courante
                bsCoureurs.Filter = strFilter.ToString
            Else
                ' ne rien afficher si il n'y pas de coureurs dans la course
                bsCoureurs.Filter = "pkCoureur=''"
            End If
        End If
    End Sub

End Class

Partager cet article
Repost0
1 mai 2007 2 01 /05 /mai /2007 12:43
Pour illustrer cette méthode nous allons prendre un exemple concret.

Imaginons que nous avons une liste d'articles classés par famille et que nous voulions utiliser un ComboBox contenant la liste des familles pour filtrer la liste des articles. Nous voulons également ajouter "<Toutes>" à la liste des familles du ComboBox pour pouvoir annuler le filtre et retrouver la liste complète de nos articles.

Pour commencer nous allons ajouter une class au code de notre WinForm :


Code:
Public Class ListItem

        Public Value As Object
        Public Text As String

        Public Sub New(ByVal NewValue As Object, ByVal NewText As String)
            Value = NewValue
            Text = NewText
        End Sub

        Public Overrides Function ToString() As String
            Return Text
        End Function
End Class




Maintenant nous allons créer la liste des familles dans notre ComboBox à l'aide d'une table contenant 2 champs (PrimaryKey, Famille) :


Code:
Dim myTable as DataTable
Dim item As DataRow

'**** içi le code pour remplir mon DataTable

MyComboBox.Items.Add(New ListItem("0", "<Toutes>"))
   For Each item In myTable.Rows
       MyComboBox.Items.Add(New ListItem(item("PrimaryKey"), item("Famille")))
   Next
MyComboBox.SelectedIndex = 0


Pour récupérer les données de chaque Item il faut procéder de cette façon :

Code:
Dim myValue as Integer
Dim myText as String

myValue=CType(myComboBox.SelectedItem, ListItem).Value
myText=CType(myComboBox.SelectedItem, ListItem).Text


La puissance de cette méthode réside dans le faite que vous pouvez ajouter autant de paramètres que vous voulez dans la class ListItem.
Partager cet article
Repost0