Overblog
Suivre ce blog Administration + Créer mon blog
24 février 2009 2 24 /02 /février /2009 17:33

Il est souvent nécessaire de créer ses propres control utilisateur pour éditer la cellule d’un DataGridView.

Prenons l’exemple couramment utilisé dans les logiciels de gestion, d’un control qui permet à l’aide d’un bouton de faire apparaitre la liste des articles, afin d’ajouter l’un d’eux à une facture.

 

Nous allons d’abord créer un control utilisateur que nous allons appeler TextBoxSelect.

Dans ce control se trouvent 2 contrôles :

  • Un TextBox dont le nom sera TextBoxText
  • Un Button dont le nom sera ButtonSelect

Assurez-vous que les propriétés de TextBoxText soient les suivantes :

  • Anchor : Top, Bottom, Left, Right

 

Assurez-vous que les propriétés de ButtonSelect soient les suivantes :

  • Anchor : Right

 

Assurez-vous que les propriétés de votre control utilisateur personnalisé  TextBoxSelect soient les suivantes :

  • AutoSizeMode : GrowAndShrink
  • AutoSize : True

 

Code du control utilisateur TextBoxSelect :

Public Class TextBoxSelect
    Protected Overridable Sub TextBoxText_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBoxText.TextChanged

    End Sub
End Class

 

 

Maintenant nous allons créer la classe TextBoxSelectCell qui va hériter de DataGridViewTextBoxCell

 

Code :

Public Class TextBoxSelectCell
    Inherits DataGridViewTextBoxCell

    Public Sub New()
    End Sub

    Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)

        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)

        Dim ctl As TextBoxSelectEditingControl = CType(DataGridView.EditingControl, TextBoxSelectEditingControl)
        ctl.TextBoxText.Text = CStr(Me.Value)

    End Sub

    Public Overrides ReadOnly Property EditType() As Type
        Get
            Return GetType(TextBoxSelectEditingControl)
        End Get
    End Property

    Public Overrides ReadOnly Property ValueType() As Type
        Get
            Return GetType(String)
        End Get
    End Property

    Public Overrides ReadOnly Property DefaultNewRowValue() As Object
        Get
            Return String.Empty
        End Get
    End Property

End Class

 

Ensuite il faut créer la classe TextBoxSelectColumn qui va hérité de DataGridViewColumn

 

Code :

Public Class TextBoxSelectColumn
    Inherits DataGridViewColumn

    Public Sub New()
        MyBase.New(New TextBoxSelectCell())
    End Sub

    Public Overrides Property CellTemplate() As System.Windows.Forms.DataGridViewCell
        Get
            Return MyBase.CellTemplate
        End Get
        Set(ByVal value As System.Windows.Forms.DataGridViewCell)
            If Not (value Is Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(TextBoxSelectCell)) Then
                Throw New InvalidCastException("La cellule doit être un TextBoxSelectCell")
            End If

            MyBase.CellTemplate = value
        End Set
    End Property

End Class

 

Il ne nous reste plus qu’a créer la classe TextBoxSelectEditingControl qui va hériter de notre control utilisateur TextBoxSelect et qui va implémenter IDataGridViewEditingControl

 

Code :

Public Class TextBoxSelectEditingControl
    Inherits TextBoxSelect
    Implements IDataGridViewEditingControl

    Private dataGridViewControl As DataGridView
    Private rowIndexNum As Integer
    Private valueIsChanged As Boolean = False

    Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle) Implements System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
        Me.TextBoxText.Font = dataGridViewCellStyle.Font
        Me.TextBoxText.ForeColor = dataGridViewCellStyle.ForeColor
        Me.TextBoxText.BackColor = dataGridViewCellStyle.BackColor
    End Sub

    Public Property EditingControlDataGridView() As System.Windows.Forms.DataGridView Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
        Get
            Return dataGridViewControl
        End Get
        Set(ByVal value As System.Windows.Forms.DataGridView)
            dataGridViewControl = value
        End Set
    End Property

    Public Property EditingControlFormattedValue() As Object Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
        Get
            Return Me.TextBoxText.Text.ToString
        End Get
        Set(ByVal value As Object)
            Me.TextBoxText.Text = CStr(value)
        End Set
    End Property

    Public Property EditingControlRowIndex() As Integer Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
        Get
            Return rowIndexNum
        End Get
        Set(ByVal value As Integer)
            rowIndexNum = value
        End Set
    End Property

    Public Property EditingControlValueChanged() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
        Get
            Return valueIsChanged
        End Get
        Set(ByVal value As Boolean)
            valueIsChanged = value
        End Set
    End Property

    Public Function EditingControlWantsInputKey(ByVal keyData As System.Windows.Forms.Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlWantsInputKey
        Select Case keyData And Keys.KeyCode
            Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
                Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp

                Return True

            Case Else
                Return False
        End Select

    End Function

    Public ReadOnly Property EditingPanelCursor() As System.Windows.Forms.Cursor Implements System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
        Get
            Return MyBase.Cursor
        End Get
    End Property

    Public Function GetEditingControlFormattedValue(ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
        Return Me.TextBoxText.Text.ToString()
    End Function

    Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
        'pas de formatage
    End Sub

    Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
        Get
            Return False
        End Get
    End Property

    Protected Overrides Sub TextBoxText_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        valueIsChanged = True
        Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
        MyBase.TextBoxText_TextChanged(sender, e)
    End Sub

End Class

Voilà, votre EditingControl personnalisé est terminé ! Il ne vous reste plus qu’a gérer l’évènement click de ButtonSelect pour que votre liste d’articles apparaisse.

 

Pour utiliser ce control dans un DataGridView il suffit de faire comme ceci :

Code :

Dim colSelect As New TextBoxSelectColumn
colSelect.DataPropertyName = "codeArticle"
colSelect.HeaderText = "Code article"

monDataGridView.Columns.Add(colSelect)

Dans cet exemple nous considérons que le DataGridView est lié à une base de donnée et que la cellule est lié au champ codeArticle de cette base de données.

Partager cet article
Repost0
19 janvier 2009 1 19 /01 /janvier /2009 07:43

De plus en plus d’internaute mettent sur internet des photos ou des vidéos de leur vie quotidienne. Cette pratique n’est pas sans danger. En effet, les photos peuvent donner beaucoup d’informations vous concernant ou concernant des personnes de votre entourage.

Avant de mettre une photo en ligne, regardez la bien, et assurez vous que rien dans l’arrière plan de la photo n’est susceptible de donner des informations d’ordre privé.

 

Voici une liste non exhaustive des éléments à vérifier :

  • Une voiture dont on voit la plaque d’immatriculation
  • Votre maison
  • Votre rue ou le panneau de votre rue
  • Le panneau de votre ville, village ou lieu dit
  • L’école de vos enfants
  • Des affiches de spectacle ou autre donnant des informations sur le lieu
  • Des objets de valeurs pouvant attirer la convoitise
  • Des documents trainant sur une table dont on peut lire le contenu (relevé bancaire, carte de crédit, documents administratifs divers)
  • L’écran d’un ordinateur allumé donnant des informations

 

Dans la mesure du possible et surtout si vous êtes mineur, ne donnez pas :

  • Votre nom de famille
  • Votre numéro de téléphone
  • Votre adresse ou votre région
  • Le nom de votre école, collège ou lycée
  • Des informations sur les personnes de votre entourage (famille, amis etc.)

 

Si vous n’êtes pas seul sur la photo, il faut demander aux personnes concernées si elles acceptent que vous mettiez leurs photos en ligne.

Soyez prudent, partager c’est bien, se donner en pâture c’est dangereux.

Partager cet article
Repost0
18 novembre 2008 2 18 /11 /novembre /2008 16:53

A moins de mettre votre image dans le dossier ClientBin où se trouve votre application Silverlight, il est difficile de retrouver le chemin d'accès d'une image.

Tout d'abord, nous allons créer une méthode qui va nous permettre de connaître le chemin de notre application :

 

Code :

Imports System.Windows.Browser

Private Function GetAppPath() As String
        Dim st1 As String
        Dim path As String = HtmlPage.Document.DocumentUri.AbsolutePath
        path = path.Substring(0, path.LastIndexOf("/") + 1)
        st1 = String.Concat("http://", HtmlPage.Document.DocumentUri.Host, ":", HtmlPage.Document.DocumentUri.Port, path)
        Return st1
End Function

 

Ensuite il suffit d'utiliser le code suivant pour changer l'image du control imgPhoto dynamiquement  :

 

Code :

Dim bi As New System.Windows.Media.Imaging.BitmapImage
Dim strImagePath As String = GetAppPath() + "images/photos/pierre.jpg"
bi.UriSource = New Uri(strImagePath, UriKind.Absolute)
imgPhoto.Source = bi

Partager cet article
Repost0
22 septembre 2008 1 22 /09 /septembre /2008 17:16

Rien de plus facile avec le nouveau framework grâce à la classe Rss20FeedFormatter.

Tout d'abord il faut importer les espaces de noms nécessaires.

Code :

Imports System.ServiceModel.Syndication
Imports System.Xml

 

Voici une fonction qui permet de lire un flux RSS existant ou d'en renvoyer un nouveau si celui-ci n'existe pas.

Code :

Private Function GetRss() As SyndicationFeed
        Dim fileExist As Boolean
        Dim filePath As String = Server.MapPath("~/public/rss/rss.xml")
        fileExist = My.Computer.FileSystem.FileExists(filePath)

        If fileExist Then
            Dim feed As SyndicationFeed

            Dim rssReader As XmlReader = XmlReader.Create(filePath)
            feed = SyndicationFeed.Load(rssReader)
            rssReader.Close()
            Return feed
        End If

        Return New SyndicationFeed
    End Function

 

 

Pour ajouter un nouvel Item dans le flux nous allons utiliser la fonction GetRss pour lire ceux déjà existant.

Code :

Private Sub WriteRss(ByVal title As String, ByVal content As String, ByVal itemAlternateLink As String, ByVal id As String, ByVal itemDate As DateTimeOffset)
        Dim filePath As String = Server.MapPath("~/public/rss/rss.xml")
        Dim feed As SyndicationFeed = GetRss()
        Dim item As SyndicationItem = New SyndicationItem(title, content, New Uri(itemAlternateLink), id, DateTime.Now)

        Dim items As List(Of SyndicationItem) = New List(Of SyndicationItem)(feed.Items)
        items.Add(item)
        feed.Items = items

        Dim rssWriter As XmlWriter = XmlWriter.Create(filePath)
        Dim rssFormatter As Rss20FeedFormatter = New Rss20FeedFormatter(feed)
        rssFormatter.WriteTo(rssWriter)
        rssWriter.Close()
    End Sub

L'utilisation de XmlWriter et XmlReader facilite grandement la tâche et Rss20FeedFormatter permet de ne plus se soucier du schema du fichier Xml.

Biensur, si vous essayez de lire un fichier Xml qui n'a pas un schema RSS 2.0 vous allez avoir une erreur. Il sera donc de bon goût de rajouter quelques Try Catch si vous n'êtes pas sur du schema des fichiers Xml que vous allez lire.

Partager cet article
Repost0
27 mai 2008 2 27 /05 /mai /2008 14:20

 

Les imports :

Code :

Imports System.Configuration
Imports System.Net.Configuration
Imports System.Web.Configuration

Le code :

Code :

Dim configurationFile As Configuration = WebConfigurationManager.OpenWebConfiguration(My.Application.Info.DirectoryPath & "Web.config")
Dim mailSettings As MailSettingsSectionGroup = configurationFile.GetSectionGroup("system.net/mailSettings") 
Dim port As Integer 
Dim host As String 
Dim password As String 
Dim username As String

If Not mailSettings Is Nothing Then
                port = mailSettings.Smtp.Network.Port
                host = mailSettings.Smtp.Network.Host
                password = mailSettings.Smtp.Network.Password
                username = mailSettings.Smtp.Network.UserName
End If

Partager cet article
Repost0
7 février 2008 4 07 /02 /février /2008 08:32

Voici une fonction qui permet d'obtenir le numéro de la semaine à partir d'une date :

 

Code :

Public Function NumSemaine(ByVal dat As Date) As Integer
        If IsDate(dat) Then
            Dim semaine As Integer
            Dim semain As Integer

            semain = Weekday(dat)
            If semain = 2 Then
                dat = dat.AddDays(6)
            End If
            If semain = 3 Then
                dat = dat.AddDays(5)
            End If
            If semain = 4 Then
                dat = dat.AddDays(4)
            End If
            If semain = 5 Then
                dat = dat.AddDays(3)
            End If
            If semain = 6 Then
                dat = dat.AddDays(2)
            End If
            If semain = 7 Then
                dat = dat.AddDays(1)
            End If
            semaine = DatePart("ww", dat, vbMonday)

            Return semaine
        End If

        Return Nothing

   End Function

Partager cet article
Repost0
1 février 2008 5 01 /02 /février /2008 15:38

Code :

If Me.maListBox.SelectedIndex > -1 Then
            Do
                Me.maListBox.Items.RemoveAt(Me.maListBox.SelectedIndex)
            Loop Until Me.maListBox.SelectedIndex = -1
End If

Partager cet article
Repost0
30 janvier 2008 3 30 /01 /janvier /2008 16:36

Imaginons que nous voulions la liste des commandes clients passées entre le 1 décembe 2007 et le 31 décembre 2007.

 

Code :

Dim sql as String

sql = "SELECT * FROM Commandes WHERE dateCommande BETWEEN '01/12/07 00:00:01' AND '31/12/07 23:59:59'"

 

Cette requête fonctionnerait très bien sur un serveur français mais pas sur un serveur anglais.

Pour permettre à cette requête de fonctionner quelque soit la langue du serveur, il suffit de procéder ainsi.

Code :

Dim sql as String

sql = "SELECT * FROM Commandes WHERE dateCommande BETWEEN '20071201 12:00:00 AM' AND '20071231 12:00:00 PM'"

Partager cet article
Repost0
29 janvier 2008 2 29 /01 /janvier /2008 15:35

Une fonctionnalité de ASP.NET 2.0 permet de rendre inaccessible un site internet tout en publiant un message de type "En maintenance" en mettant à la racine du site un fichier app_offline.htm.

Pour que cela fonctionne correctement et ne pas avoir une page d'erreur 404, il faut s'assurer de 2 choses :

1) Tout d'abord, il faut ajouter la ligne suivante au fichier web.config pour que les fichiers html puissent être interprétés.

 

Code :

<httpRuntime enable ="true "/>

 

 

 

2) Ensuite il faut s'assurer que le fichier fasse plus de 512 bits.

 

Code :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

    <title>Site en maintenance</title>

</head>

<body>

    <h1>EN MAINTENANCE</h1>

    <h2>Le site est en maintenance.</h2>

<!--       

    Il suffit d'ajouter un peu de texte cacher
    pour grossir le fichier et ainsi éviter
    d'avoir une page d'erreur
    HTTP 404

    <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

   <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

   <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>

    <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2>
    <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2>
   <h2>Le site est en maintenance.</h2> 

-->

</body>

</html>

 

Pour relancer le site, il suffit de supprimer le fichier app_offline.htm.

Partager cet article
Repost0
21 janvier 2008 1 21 /01 /janvier /2008 18:21

Lorsque l'on met un contrôle dans un LoginView, celui-ci n'est plus accessible dans l'intellisense et n'est plus déclaré dans le code behind.

Pour y accéder, il suffit de vérifier si l'utilisateur c'est identifié et à quel rôle il appartient, car seul les contrôles  visibles seront accessibles. Vous ne pourrez donc pas accéder à un contrôle qui se trouve dans un template "Anonymous" si l'utilisateur c'est identifié.

Prenons L'exemple d'un contôle menu se trouvant dans le template "Anonymous" d'un LoginView.

Code :

Dim menuAnonymous As Menu

If Not My.User.IsAuthenticated Then

menuAnonymous = Me.LoginViewAnonymous.FindControl("menuAnonymous")

End If

 

On utilise la méthode FindControl pour récupérer le contrôle Menu.

Partager cet article
Repost0