L’utilisateur a souvent tendance à cliquer plusieurs fois sur le bouton de validation d’un formulaire, pensant que le premier clique n’a pas été pris en compte.

Par exemple, dans le cas d’un formulaire envoyant un email, il en résulte plusieurs envoies du même email.

Pour éviter ce désagrément et informer l’utilisateur que son premier clique a bien été pris en compte nous allons ajouter un peu de JavaScript dans notre code.

Dans cette exemple l’ID du bouton est “ButtonEnvoyer”. Vous devez remplacer cette ID par l’ID de votre bouton.

 

Voici notre bouton :

Code :

<asp:Button  id="ButtonEnvoyer" runat="server" Text="Envoyer" Width="125px" />

 

Et voici le code behind qui permet d’ajouter le JavaScript.

Code :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim sbValid As System.Text.StringBuilder = New System.Text.StringBuilder

        sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ")

        sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ")

        sbValid.Append("this.value = 'Patientez svp...';")

        sbValid.Append("this.disabled = true;")

        sbValid.Append(ClientScript.GetPostBackEventReference(Me.ButtonEnvoyer, Nothing).ToString)

        sbValid.Append(";")

        ButtonEnvoyer.Attributes.Add("onclick", sbValid.ToString())

 

End Sub

 

Si le formulaire n’est pas valide le bouton est Enabled=True et affiche le texte “Envoyer”.

Si le formulaire est valide le bouton est Enabled=False et affiche “Patientez svp…”

Ce bouton peut être mis dans un UpdatePanel.


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Voici la configuration du  Membership provider se trouvant dans le Web.config :

 

Code :

<membership>
            <providers>
                <remove name="AspNetSqlMembershipProvider"/>
                <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="myConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="100" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
            </providers>
        </membership>

 

D’après cette configuration, le mot de passe doit être de 6 caractères minimum et il est “Hashed” ce qui veut dire que l’on ne peut pas retrouver le mot de passe de l’utilisateur dans la base de données.

Si on utilise directement MembershipUser.ResetPassord, la méthode va générer un mot de passe qui est généralement très compliqué. La solution serait de Override la méthode, mais créer une nouvelle classe qui hérite de MemberShipUser juste pour Override une méthode c’est un peu lourd.

 

Voici comment procéder pour faire plus simple.

Tout d’abord nous allons créer une méthode qui va nous retourner le MemberShipUser à partir du nom de l’utilisateur.

Code :

Public Function GetMembershipUser(ByVal userName As String) As MembershipUser
        Dim mu As MembershipUser
        If userName = Nothing Then
            mu = Membership.GetUser()
        Else
            mu = Membership.GetUser(userName)
        End If
        Return mu
    End Function

Ensuite nous allons créer une méthode qui va générer notre nouveau mot de passe.

Code :

Public Function GenPassword(ByVal lenght As Integer) As String
        Dim strAlphaNum As String()
        Dim password As New StringBuilder
        Dim rnd As New Random
        strAlphaNum = New String(58) {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
        For iAlpha As Integer = 1 To lenght
            password.Append(strAlphaNum(rnd.Next(58)))
        Next
        Return password.ToString
    End Function

Vous remarquerez que la lettre O et le chiffre 0 ne seront pas utilisés car trop souvent confondu par les utilisateurs.

 

Et enfin nous allons créer notre propre méthode ResetUserPassword.

Code :

Public Function ResetUserPassword(ByVal userName As String) As String
        Dim mu As MembershipUser = GetMembershipUser(userName)
        Dim oldPassword As String = mu.ResetPassword
        Dim newPassword As String = GenPassword(Membership.MinRequiredPasswordLength)
        mu.ChangePassword(oldPassword, newPassword)
        Return newPassword
    End Function

L’astuce est simple. On utilise MembershipUser .ResetPassword qui va nous retourner un nouveau mot de passe, puis on utilise MembershipUser.ChangePassword pour modifier à nouveau le mot de passe, mais cette fois ci, en utilisant notre propre méthode GenPassword.


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Vous pouvez forcer IE8 à se comporter comme IE7 en ajoutant un meta tag entres les balises <head> de votre page ou de votre MasterPage.

Ceci peut résoudre des problèmes de compatibilité avec IE8, qui sont courant, en particulier pour l’affichage des menus.

 

Code :

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Pour réaliser facilement un pied de page dans une MasterPage il vous faut 2 <div>. Le premier contiendra le contenue de la page et devra avoir un min-height de 100%. Le deuxième contiendra votre pied de page et devra avoir une position absolute et un bottom de 0 pixels.

Code :

<div id="nonfooter" style="min-height:100%;font-size: large; height: 100%;" align="left">
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
</div>


    <div id="footer"
        style="width: 100%;position:fixed;bottom:0px;background-color: #7B0C00; font-family: verdana; color: #FFFFFF; font-size: xx-small;">
        Conception
        <asp:HyperLink ID="HyperLink1" runat="server" ForeColor="White"
            NavigateUrl="http://www.cyrilhome.com">Cyril Hennebique</asp:HyperLink>
    </div>


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Google Maps et ASP.NET ne font pas vraiment bon ménage surtout lorsque le site utilise une MasterPage.

Voici une astuce qui va vous permettre d’intégrer Google Maps sans effort en utilisant un iframe.

Pour commencer nous allons créer une page html qui contiendra la carte :

 

Code :

<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">

    function initialize() {
           var myLatlng = new google.maps.LatLng(43.317645, -0.438981);
           var myOptions = { zoom: 16, center: myLatlng, mapTypeId: google.maps.MapTypeId.HYBRID }
           map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
           var infowindow = new google.maps.InfoWindow({ content: '<b>EL SALSERO</b> <br> rue Saint-Exupéry <br> 64230 LESCAR <br> <i>Anciennement "La Pression Paloise"</i>', size: new google.maps.Size(250, 100) });

           var marker = new google.maps.Marker({ position: myLatlng, map: map, title: "EL SALSERO" });
           google.maps.event.addListener(marker, 'click', function() { infowindow.open(map, marker); });
           }
    </script>
    <title>Carte</title>
</head>
<body style="margin: 0; background-color: #ffcc00"   onload="initialize()" >
<div id="map_canvas" style="background-color: #ffcc00; width: 800px; height: 600px"></div>

</body>
</html>

 

Ensuite nous allons créer une page aspx qui contiendra l’iframe dans lequel s’affichera notre page html :

 

Code :

<%@ Page EnableEventValidation="false"  Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="carte.aspx.vb" Inherits="public_carte" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="server" >
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div style="text-align: center">
<iframe id="mapFrame" src="carte.htm" scrolling="no" frameborder="0"
        marginheight="0" marginwidth="0"
        style="background-color: #ffcc00; width: 800px; height: 600px; text-align: center;"
        align="middle" />
</div>

</asp:Content>

 

Vous remarquerez que l’iframe et et le div de la carte ont la même dimension (800 par 600) et que l’iframe n’a pas de bordure ce qui crée l’illusion.

Vous devez également mettre EnableEventValidation="false" dans l’entête de votre page aspx sous peine d’avoir un message d’erreur lorsque vous visiterez une autre page du site.


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Si les images d’arrière plan de votre tableau ou d’autres images ne s’affichent pas c’est que vous avez surement un problème de chemin d’accès à l’image.

Voici une astuce qui va vous permettre d’afficher correctement une image où qu’elle soit sur votre site :

 

Code :

style="background-image: url(<%=Page.ResolveUrl("~/images/background.jpg")%>)


Ecrire un commentaire - Voir les 0 commentaires - Recommander

smallbasic  

SmallBasic est un petit logiciel permettant de s’initier à la programmation en Visual Basic. Il est destiné principalement aux collégiens.

Il est désormais disponible en version Française. Cependant l’interface d’installation reste en anglais.

Site officiel : www.smallbasic.com


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Vous devez tout d’abord ajouter une référence à l’espace de noms System.Management à votre application puis faire un Import System.Management au début de votre code.

Les objets de cet espace de nom vont nous permettre d’utiliser le Windows Management Instrumentation (WMI).

 

Dans l’exemple suivant, nous allons remplir une DataTable avec le nom des comptes utilisateurs.

 

Code :

        Dim _dtUsers as New DataTable("Users")
        Dim col As New DataColumn("Name", GetType(String))
        col.MaxLength = 500

        _dtUsers.Columns.Add(col)

        Dim query As New SelectQuery("Win32_UserAccount")
        Dim searcher As New ManagementObjectSearcher(query)

        Dim newRow As DataRow

        For Each envVar As ManagementObject In searcher.Get()
            newRow = _dtUsers.NewRow

            newRow("Name") = envVar("Name")
            _dtUsers.Rows.Add(newRow)
        Next

 

Vous trouverez la liste des propriétés de Win32_UserAccount içi.


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Vous avez supprimer l’icône “Afficher le bureau” de votre barre de lancement rapide et vous aimeriez bien le remettre.

Voici comment :

1. Ouvrez le bloc notes qui se trouve généralement dans le menu accessoire du menu démarrer.

2. Tapez le texte suivant dans le Bloc notes :

[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop

3. Enregistrez le fichier en tant que Afficher le bureau.scf

4. Glissez ce fichier dans votre barre de lancement rapide


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Cet exemple nécessite l’installation du composant WinListView de chez Infragistics.

 

Code :

        Imports Infragistics.Win.UltraWinListView

 

        Dim SelectedItems As Object() = Me.UltraListViewPhotos.SelectedItems.All

        Me.UltraListViewPhotos.BeginUpdate()

        For i As Integer = 0 To SelectedItems.Length - 1
            Dim item As UltraListViewItem = CType(SelectedItems(i), UltraListViewItem)
            Me.UltraListViewPhotos.Items.Remove(item)
        Next

        Me.UltraListViewPhotos.EndUpdate()


Ecrire un commentaire - Voir les 0 commentaires - Recommander

De nos jours l’internet est de moins en moins libre mais heureusement les internautes ont encore beaucoup d’outils à leur disposition pour garder une grande liberté d’expression et d’échange sur internet.

La solution la plus courante pour rester anonyme et contourner des restrictions sur internet est d’utiliser des serveurs proxy qui masqueront votre identité (ou adresse IP) .

Les réseaux les plus couramment utilisés pour télécharger des fichiers sont les suivant :

 

Remarque : Les logiciels de P2P, Torrent ou NewsGroup ne sont pas illégaux. Les installer sur votre ordinateur n’est pas une infraction à la loi. Ce qui peut être illégal c’est l’utilisation que vous en faites.

 

Le serveur de newsgroup GigaNews propose un petit logiciel (GigaNews Accelerator) qui permet de compresser et crypter (256 bits SSL) vos transmissions lors du téléchargement. Cela ne vous rend pas anonyme mais permet d’éviter tout espionnage des données que vous téléchargez.

Chacun de ces réseaux de téléchargement utilise des ports et des protocoles de communication différent. Il existe beaucoup de méthodes pour être anonyme sur le réseau Web mais très peu pour les autres réseaux.

 

Voici quelques solutions intéressantes que j’ai retenu et qui fonctionnent pour tous les types de réseaux :

 

Antifirewall est à déconseillé pour un novice mais vous pouvez télécharger la version de démo pour en juger par vous même.

SurfSolo est la solution la plus puissante et la plus simple mais aussi la plus coûteuse (environ 80 € par an pour une limite de 20 Go de téléchargement par mois). A vous de voir si le jeu en vaut la chandelle.

 

Remarque : L’anonymat sur internet n’existe pas vraiment. En effet, celui qui vous procure l’anonymat connait votre identité et connait également votre activité sur internet. Ceci est d’autant plus vrai si vous utilisez un service payant, car il n’y a rien de mieux pour vous identifier que votre carte bancaire qui est beaucoup plus précise et sur qu’une simple adresse IP.

Prenons l’exemple d’un utilisateur qui utiliserais SurfSolo de SecurStar pour télécharger des films depuis un newsgroups sur GigaNews. SecurStar est une société située en Allemagne et est donc régit par les lois allemandes et européennes. L’adresse IP de l’utilisateur n’apparait pas sur les logs du serveur de GigaNews mais en revanche l’IP du serveur de SecurStar apparait. En déterminant qui est propriétaire du serveur il est facile de remonter à la société SecurStar. Comme cette société est en Europe, elle peut être obligée par la justice de donner l’identité de tous ses abonnés qui utilisent un serveur spécifique. Et là c’est encore mieux que l’adresse IP car votre carte bancaire ainsi que vos relevés bancaires certifient que vous êtes l’utilisateur du service. Maintenant que vous êtes identifié il reste à connaitre ce que vous téléchargez car la transmission est cryptée, et ça, c’est nettement moins évident sans la collaboration de la société SecurStar.

Voici la politique de confidentialité de GigaNews : Politique de confidentialité Vous constaterez à la lecture de ce texte que GigaNews ne protégera pas votre identité dans le cadre d’une procédure de justice.

Voici la politique de confidentialité de SecurStar : Politique de confidentialité Elle ne dit rien sur le sujet.

 

A noter également :

  • Le projet FreeNet pour ceux qui sont vraiment parano et qui ne sont pas pressés car très lent.
  • Le projet IPredator dont le site est en préparation et qui utilise un tunnel VPN comme SufSolo.

 

Souvenez-vous que sans anonymat il n’y a pas de réelle liberté d’expression.


Ecrire un commentaire - Voir les 1 commentaires - Recommander

Pour stocker des images dans une base de données SQL Server, il est nécessaire de convertir les images en Byte() et inversement quand on veut récupérer les images.

 

Voici donc 2 fonctions qui permettent de réaliser ceci :

 

Code :

Imports System.IO
Imports System.Drawing

 

Public Function ImageToByteArray(ByVal img As Image) As Byte()
            Dim stream As New MemoryStream
            img.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Return stream.ToArray
End Function

 

Public Function ByteArrayToImage(ByVal ByteArray As Byte()) As Image
            Dim stream As New MemoryStream(ByteArray, 0, ByteArray.Length)
            Return Image.FromStream(stream, True)
End Function


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Le comportement que je recherchais étais de pouvoir cocher la CheckBox d’une ligne pour indiquer un tarif par défaut dans un DatagridView.

Ceci implique que si la valeur du CheckBox d’une ligne est égal à True, tous les autres CheckBox doivent être égal à False, ce qui ressemble au comportement du RadioButton.

Mon DataGridView est lié au BindingSource _bsTarifs et la colonne est liée au champ  tarifParDefaut.

 

Code :

Private Sub DataGridViewTarifs_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewTarifs.CellBeginEdit
       If Me.DataGridViewTarifs.CurrentRow.Cells("tarifParDefaut").ColumnIndex = e.ColumnIndex Then
           For Each row As DataGridViewRow In Me.DataGridViewTarifs.Rows
               If row IsNot CType(_bsTarifs.Current, DataRowView).Row Then
                   row.Cells("tarifParDefaut").Value = False
               Else
                   row.Cells("tarifParDefaut").Value = True
               End If
           Next
       End If
   End Sub

Même pas besoin de Custom Control ! :)


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Dans certain cas, il peut être intéressant de cacher un compte utilisateur pour qu’il n’apparaisse pas sur l’écran de bienvenue de Windows Vista.

Voici 3 exemples pour lesquels cela peut être utile :

  • Un compte utilisé uniquement pour le “bureau à distance” (Terminal serveur RDP)
  • Un compte utilisé pour accéder à un serveur FTP sous IIS
  • Un compte que vous utilisez occasionnellement mais que vous ne voulez pas effacer

 

Voici les étapes à suivre (Attention ! Vous devez utiliser un compte administrateur pour pouvoir éditer le registre de Windows) :

  1. Cliquez sur le menu “Démarrer” et dans “Rechercher” tapez “Regedit
  2. Une fois trouvé, cliquez sur “Regedit” pour le lancer
  3. Allez jusqu’à la clef suivante “HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon”
  4. Faites un cliques droit sur la clef “Winlogon” puis, dans le menu, cliquez sur “Nouveau” puis “Clé
  5. Nommez votre clé “SpecialAccounts
  6. Faites un cliques droit sur la clef “SpecialAccounts” puis, dans le menu, cliquez sur “Nouveau” puis “Clé
  7. Nommez votre clé “UserList
  8. Faites un cliques droit sur la clef “UserList puis, dans le menu, cliquez sur “Nouveau” puis “Valeur DWORD (32bits)”
  9. Nommez votre valeur avec le nom du compte utilisateur que vous voulez cacher. (Attention ! Ne cachez pas le compte administrateur principal !)
  10. Faites un double clique sur la valeur pour l’éditer. Mettez la valeur 0 pour cacher le compte ou 1 pour qu’il soit visible.

 

Vous pouvez cacher plusieurs comptes en ajoutant une valeur dans “UserList” pour chaque compte utilisateur que vous voulez cacher.


Ecrire un commentaire - Voir les 1 commentaires - Recommander

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.


Ecrire un commentaire - Voir les 0 commentaires - Recommander

Présentation

  • : Développement .NET par Cyril
  • cyrilhome

Mes infos

Syndication

  • Flux RSS des articles

Mes logiciels

Rechercher

Catégories

 
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus