Dessiner une grille dans une Form

Signaler
-
 guilld -
Bonjour,

je cherche comment dessiner une grille dans une FORM qui pourra accueillir des données saisie par l'utilisateur (INTEGER), puis effectuer l'enregistrement dans une base de données.
je ne sais pas comment commencer..
Merci pour votre aide.

8 réponses

Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
125
Bonjour,

Pour ce que tu veux faire, il n'est pas nécessaire de dessiner une grille. Il y a un contrôle pour cela la DatagridView. Voir son utilisation:

http://plasserre.developpez.com/cours/vb-net/?page=ui-winforms5#LVIII-Q-2

Pour ce qui est des données, il y a la base de données. Voir ceci pour de nombreux exemples:

http://codes-sources.commentcamarche.net/source/list/visual-basic-vb-net-1/17-base-de-donnees/last

Merci d'avoir répondu si vite.
Pour tout avouer je m'attendais à cette réponse, j'aurai du être plus précis mais je vais tout de même explorer cette voie.
L'objectif étant de mettre une image en fond de cette grille et saisir des nombres dans des cases (comme une cartographie) puis enregistrer le tout dans une base (sauf l'image). Cette grille doit avoir un nombre de case fixe.
Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
125
Je pense qu'il faut que tu te tournes sur des programmes de Sudoku pour faire ta grille. Il y a plein d'exemple sur ce site.
Est il possible d'inserrer une image en fond d'une DatagridView ?
Ou, si j'ai une image en fond de ma FORM, comment la voir au travers de la DatagridView ?
Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
125
Ce n'est pas possible. Voici un exemple pour créer des textBox dynamiques, pour mettre tes données. Tu ne pourras pas non plus mettre une image derrière. Par contre pour enregistrer tes données cela sera facile.
Dimension Form= 300x300
Mettre un panel qui recouvre tout le Form

Voici le code:

Option Strict On
Public Class Form1
    Dim texte As TextBox
    Dim x, y, diff, dify As Int32
    Dim vignette As Integer
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim i As Int32
        Panel1.Controls.Clear()
        y = 0
        x = 0
        For i = 0 To 9
            'création TextBox
            texte = New TextBox()
            texte.Multiline = True
            texte.Width = 100
            texte.Height = 100
            texte.BorderStyle = BorderStyle.Fixed3D
            texte.Visible = True
            texte.Name = "montexte" & i
            vignette = 90
            texte.SetBounds(x, y, vignette, vignette)
            x += vignette
            'vérifier s'il ya suffisamment d'espace dans l'axe x pour ajouter une textBox
            If x >= Panel1.Width Or (x + vignette) > Panel1.Width Then
                diff = Panel1.Width - x
                'S'il n'y a pas assez d'espace, commencer une nouvelle ligne ci-dessous
                y += vignette
                x = 0
            End If
            If ((y + vignette) > Panel1.Height) Then
                dify = Panel1.Height - y
            End If
            'ajouter une textBox
            Panel1.Controls.Add(texte)
        Next i
    End Sub
End Class
Ce bout de code fonctionne parfaitement merci. Donc je cherche toujours une astuce pour coller une image de fond sur laquelle je vais pouvoir saisir du texte n'importe ou. Un peu comme une annotation sur un PDF. Puis les données devront être mises dans une DB (SQL)..... En tout cas, merci pour ca.
Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
125
J'ai fait un programme avec des textBox dynamiques transparents.

L'utilisation se fait par raccourcis clavier:
"Ctrl + alt + b" pour sélectionner le 1 er textBox, ensuite la touche à gauche du A (j'ai, un trou de mémoire) pour se déplacer

On saisit le texte

Pour l'enregistrer:
"Ctrl + alt + c"

Il faut d'abord créer tous les fichiers textes en enregistrant tous les textBox

Nouveau programme, mettre 2 Form
dans le Form1 mettre l'image et ce code:

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.Width = 280
        Me.Height = 300
        Me.Location = New Point(100, 100)
        Form2.Show()
    End Sub
   End Class


Dans le Form2, ce code:

Option Strict Off
Imports System.IO
Public Class Form2
    Enum FsModifiers
        None = 0
        Alt = 1
        Control = 2
        Shift = 4
        Windows = 8
        Alt_Ctrl = 3
        Alt_Shift = 5
        Alt_Windows = 9
        Ctrl_Shift = 6
        Ctrl_Windows = 10
        Shift_Windows = 12
        No_Repeat = 16384
    End Enum
    Declare Auto Function RegisterHotKey Lib "user32.dll" (ByVal handle As IntPtr, ByVal id As Integer, ByVal fsModifier As FsModifiers, ByVal vk As Keys) As Boolean
    Declare Auto Function UnregisterHotKey Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal id As Integer) As Integer
    Private Const HOTKEY_ID1 As Integer = 571584
    Private Const HOTKEY_ID2 As Integer = 752452
    Private Const WM_HOTKEY As Integer = 786
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg 'on va tester le message reçu à chaque appel de cette fonction
            Case WM_HOTKEY 'si il s'agit du message WM_HOTKEY (si l'utilisateur a appuyé sur CTRL + ALT + B)
                If m.WParam = HOTKEY_ID1 Then 'on cherche quelle hotkey a déclenché l'évènement
                    ' MsgBox("Ctrl + alt + b")
                    selection()
                ElseIf m.WParam = HOTKEY_ID2 Then
                    '  MsgBox("Ctrl + alt + c")
                    save_texte()
                End If

        End Select
        MyBase.WndProc(m)
    End Sub
    Dim texte As TextBox
    Dim x, y, diff, dify As Int32
    Dim vignette As Integer
    Dim nom As String
    Dim textesave As String
    Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        UnregisterHotKey(Me.Handle, HOTKEY_ID1)
        UnregisterHotKey(Me.Handle, HOTKEY_ID2)
    End Sub
    Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        RegisterHotKey(Me.Handle, HOTKEY_ID1, FsModifiers.Alt_Ctrl, Keys.B)
        RegisterHotKey(Me.Handle, HOTKEY_ID2, FsModifiers.Alt_Ctrl, Keys.C)
        Me.Location = New Point(100, 100)
        Me.Width = 280
        Me.Height = 300
        Me.TransparencyKey = Color.White
        Me.BackColor = Color.White
        Me.TopMost = True
        Dim i As Int32
        Panel1.Controls.Clear()
        y = 0
        x = 0
        For i = 1 To 9
            'création TextBox
            texte = New TextBox()
            texte.Multiline = True
            texte.Width = 100
            texte.Height = 100
            texte.BackColor = Color.White
            texte.ForeColor = Color.Red
            texte.Font = New Font("Tahoma", 20, FontStyle.Bold)
            texte.BorderStyle = BorderStyle.Fixed3D
            texte.Visible = True
            texte.Name = "montexte" & i
            texte.ShortcutsEnabled = True
            'texte.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
            vignette = 90
            texte.SetBounds(x, y, vignette, vignette)
            x += vignette
            'vérifier s'il ya suffisamment d'espace dans l'axe x pour ajouter une textBox
            If x >= Panel1.Width Or (x + vignette) > Panel1.Width Then
                diff = Panel1.Width - x
                'S'il n'y a pas assez d'espace, commencer une nouvelle ligne ci-dessous
                y += vignette
                x = 0
            End If
            If ((y + vignette) > Panel1.Height) Then
                dify = Panel1.Height - y
            End If
            'ajouter une textBox
            Panel1.Controls.Add(texte)
        Next i
    End Sub
  Private Sub selection()
        Dim ctrl As Control
        For Each ctrl In Panel1.Controls
            If (ctrl.GetType() Is GetType(TextBox)) Then
                Dim txt As TextBox = CType(ctrl, TextBox)
                If txt.Name = "montexte1" Then
                    txt.Focus()
                End If
            End If
        Next
    End Sub
    Private Sub save_texte()
        Dim ctrl As Control
        For Each ctrl In Panel1.Controls
            If (ctrl.GetType() Is GetType(TextBox)) Then
                Dim txt As TextBox = CType(ctrl, TextBox)
                If txt.Focused = True Then
                    nom = txt.Name
                    textesave = txt.Text
                    If File.Exists(Application.StartupPath & "\" & nom & ".txt") Then
                        Dim contenu As New System.IO.StreamWriter(Application.StartupPath & "\" & nom & ".txt")
                        contenu.Write(textesave)
                        textesave = String.Empty
                        contenu.Close()
                        MessageBox.Show("Fichier enrgistré", "Enregistrement fichier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Else
                        Dim mon_fichier As New FileInfo(Application.StartupPath & "\" & nom & ".txt")
                        mon_fichier.Create()
                        MessageBox.Show("Fichier créé", "Création fichier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                End If
            End If
        Next
    End Sub
End Class


Bonne programmation
Messages postés
7439
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juillet 2021
125
J'ai oublié de te dire qu'il faut un panel qui recouvre le Form2. Mais cela tu le sais déjà!
Franchement, merci ! je vais tester tout ca demain matin...