2008-12-01 11 views
1

Je souhaite afficher une liste de lettres d'un z à travers sur un formulaire. Chaque lettre doit être cliquable avec cette valeur transmise en tant qu'argument de clic. En plus de créer 26 lettres et d'utiliser l'événement click de chaque lettre, quelqu'un connaît-il un moyen rapide de le faire? Je sais comment charger les contrôles dynamiques etc et comment le faire de cette façon. Je me demandais juste si quelqu'un savait d'une manière intelligente de faire cela?Création d'une bande de lettres sélectionnables pour un formulaire

Vive

Répondre

1

Vous pouvez utiliser un FlowLayoutPanel et une boucle comme ceci:

private void button1_Click(object sender, EventArgs e) 
{ 
    flowLayoutPanel1.FlowDirection = FlowDirection.LeftToRight; 
    flowLayoutPanel1.AutoSize = true; 
    flowLayoutPanel1.WrapContents = false; //or true, whichever you like 
    flowLayoutPanel1.Controls.Clear(); 

    for (char c = 'A'; c <= 'Z'; c++) 
    { 
    Label letter = new Label(); 
    letter.Text = c.ToString(); 
    letter.AutoSize = true; 
    letter.Click += new EventHandler(letter_Click); 
    flowLayoutPanel1.Controls.Add(letter); 

    } 
} 

private void letter_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("You clicked on " + ((Label)sender).Text); 
} 
+0

Juste ce dont j'avais besoin, bravo pour ça! – anonym0use

1

C'est la « manière dynamique » je le ferais. Je sais que vous avez demandé d'autres moyens astucieux de le faire dans mais je pense que c'est la façon la plus acceptée pour le faire. Cela produira ces boutons et ajoutera un gestionnaire de clics qui prendra le bouton en tant qu'expéditeur. Il verra aussi à ce que l'emplacement des boutons s'enroule si à l'extérieur de la largeur du formulaire.

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim ButtonSize As New Size(20, 20) 
    Dim ButtonLocation As New Point(10, 20) 

    For p As Integer = Asc("A") To Asc("Z") 
     Dim newButton As New Button    
     If ButtonLocation.X + ButtonSize.Width > Me.Width Then 
      ButtonLocation.X = 10 
      ButtonLocation.Y += ButtonSize.Height 
     End If 
     newButton.Size = ButtonSize 
     newButton.Location = ButtonLocation 
     newButton.Text = Chr(p) 
     ButtonLocation.X += newButton.Width + 5 
     AddHandler newButton.Click, AddressOf ButtonClicked 
     Me.Controls.Add(newButton) 
    Next 

    End Sub 

    Sub ButtonClicked(ByVal sender As Object, ByVal e As System.EventArgs) 
     MsgBox(CType(sender, Button).Text) 
    End Sub 
End Class 

alt text http://img235.imageshack.us/img235/2267/testoa6.jpg

+0

+1 pour faire le mile supplémentaire et faire la mathématique de la position. :) FlowLayoutPanel n'est peut-être pas toujours une option. – Tomalak

+0

J'aime le FlowLayoutPanel, mais lorsque j'écris des exemples courts, j'aime avoir le moins de contrôles possibles. ;) – Stefan

0

Dessine une chaîne sur un contrôle, puis correspondent clics de souris aux positions de caractères sur la forme. C'est en fait plus facile qu'il n'y paraît (ceci est adapté de la documentation standard sur MeasureCharacterRanges, ce qui simplifie la tâche entrante). L'exemple est dessiné sur un formulaire, il serait assez simple d'en faire un contrôle utilisateur.

Dans cet exemple, si vous cliquez sur une lettre, une boîte de message apparaît et vous indique la lettre sur laquelle vous venez de cliquer.

Espérons que ça aide.

P.S. S'il vous plaît pardonner "numéros magiques" par ex. "Connaître" il y aura 25 éléments dans le tableau, c'est juste un échantillon après tout :)

Public Class Form1 

    Const LETTERS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    Private letterRects(25) As System.Drawing.RectangleF 
    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click 
     Dim index As Integer = -1 
     Dim mouseP As Point = Me.PointToClient(MousePosition) 
     For i As Integer = 0 To 25 
      If letterRects(i).Contains(mouseP.X, mouseP.Y) Then 
       index = i 
       Exit For 
      End If 
     Next 
     If index >= 0 Then 
      MessageBox.Show("Letter = " + LETTERS(index).ToString()) 
     End If 
    End Sub 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
     ' Set up string. 
     Dim stringFont As New Font("Times New Roman", 16.0F) 

     ' Set character ranges 
     Dim characterRanges(26) As CharacterRange 
     For i As Integer = 0 To 25 
      characterRanges(i) = New CharacterRange(i, 1) 
     Next 

     ' Create rectangle for layout, measurements below are not exact, these are "magic numbers" 
     Dim x As Single = 50.0F 
     Dim y As Single = 50.0F 
     Dim width As Single = 400.0F 
     Dim height As Single = 40.0F 
     Dim layoutRect As New RectangleF(x, y, width, height) 

     ' Set string format. 
     Dim stringFormat As New StringFormat 
     stringFormat.FormatFlags = StringFormatFlags.FitBlackBox 
     stringFormat.SetMeasurableCharacterRanges(characterRanges) 

     ' Draw string to screen. 
     e.Graphics.DrawString(letters, stringFont, Brushes.Black, _ 
     x, y, stringFormat) 
     Dim stringRegions() As [Region] 
     ' Measure two ranges in string. 
     stringRegions = e.Graphics.MeasureCharacterRanges(letters, _ 
     stringFont, layoutRect, stringFormat) 
     For i As Integer = 0 To 25 
      letterRects(i) = stringRegions(i).GetBounds(e.Graphics) 
     Next 
    End Sub 
End Class 
+0

Qu'en est-il des utilisateurs dont le paramètre «Grandes polices» est activé ou d'autres modifications apportées à la configuration de Windows ou d'une police manquante? Cela fonctionne-t-il également pour eux? – Tomalak

+0

Pour être honnête, je n'en ai aucune idée, et je partirai en disant cela comme un exercice pour le lecteur :) –

+0

C'était une question rhétorique de toute façon. :-) – Tomalak

Questions connexes