2009-11-05 5 views
0

bien, le titre à peu près tout dit.étiquette wont ajouter au contrôle du panneau à l'exécution (mais je ne reçois aucune erreur)

est ici un peu d'info: j'ai un fichier texte, et à l'intérieur que textfile contient:

Label 
"this text will be associated with the Text property of the label once the label has been added to the Panel Control at runtime." 
20, 45 
Trebuchet MS 
14.0 

explication de la au-dessus du fichier ci-dessus ne peut avoir qu'une seule étiquette-info, ou il peut j'en ai mille. Voici comment cela fonctionne:

Control 
Text Property 
Locatoin 
Font Name 
Font Size 

... Maintenant, tout va bien si je laisse les informations de police du fichier. mais dès que j'ai modifié mon expression régulière en fonction du nom de la police et de la taille de la police, mon programme n'ajoute plus le contrôle au Panel lors de l'exécution. il n'y a pas non plus d'erreurs de débogage ou de lignes squigly laides. Ça ne montre rien.

Donc, je suppose que c'est la dernière partie de la regex qui essaie de faire correspondre les informations de police/quelqu'un peut m'aider s'il vous plaît à comprendre/résoudre ce problème?

le code que j'ai est:

public partial class Form1 : Form 
{ 
    private void FillCanvas() 
    { 
     canvas.Controls.Clear(); 
     canvas.Visible = true; 
     canvas.BringToFront(); 
     txt.Visible = false; 

     MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)\r\n""(\w*)\r\n" + 
      @"(\d+)"); 
     foreach (Match match in lines) 
     { 
      string control = match.Groups[1].Value; 
      string text = match.Groups[2].Value; 
      int x = Int32.Parse(match.Groups[3].Value); 
      int y = Int32.Parse(match.Groups[4].Value); 

      string fname = match.Groups[6].Value; 
      float fsize = float.Parse(match.Groups[7].Value); 

      switch (control) 
      { 
       case "Label": 
        Label label = new Label(); 
        label.Text = text; 

        label.AutoSize = true; 
        label.IsAccessible = true; 

        label.Font = new Font(fname, fsize); 
        label.MouseMove += new MouseEventHandler(label_MouseMove); 
        label.MouseDown += new MouseEventHandler(label_MouseDown); 
        label.MouseUp += new MouseEventHandler(label_MouseUp); 
        label.Click += new EventHandler(label_Click); 
        label.DoubleClick += new EventHandler(label_DoubleClick); 

        canvas.Controls.Add(label); 
        ControlCount++; 
        label.Name = ControlCount.ToString(); 
        label.Location = new Point(x, y); 
        SelectedControl = label.Name; 
        break; 

Répondre

2

Votre motif regex est incorrect. Changez-le en:

@"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+)" 

Votre motif original rencontre 2 problèmes lorsqu'il tente de faire correspondre le nom de la police. Tout d'abord, il a des guillemets inutiles, mais il n'y en a aucun pour la section de nom de police. Deuxièmement, le nom de la police peut contenir un espace et votre motif ne l'a pas pris en compte.

Votre modèle:

@"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)\r\n""(\w*)\r\n(\d+)" 
              ^^
              | | 
          1st problem ___| | 
           2nd problem ___|     

BTW, le modèle actuel ne saisit pas correctement la taille des caractères "14.0". Il capturera "14" seulement. Si vous devez capturer le reste, pensez à utiliser (\d+(?:\.\d+)?) à la place si c'est un format optionnel. Si vous vous attendez toujours à ce que ce soit dans ce format, utilisez (\d+\.\d+).

EDIT: Si c'est sous votre contrôle, je suggère plutôt de changer l'approche du fichier texte/regex au format XML. Un bon LINQ to XML rendra cela plus simple à maintenir.

+0

OH MERCI BEAUCOUP Ahmad Mageed, je suis tellement heureux en ce moment je pense que je vais pleurer lol. –

2

Avez-vous mis un point d'arrêt à l'intérieur du foreach et débogué? Puisque vous itérez sur les résultats d'une MatchCollection, le premier endroit que je vérifie est de voir si vous avez zéro correspondances.

+0

ouais j'ai. toujours rien. rien du tout. –

+0

merci pour votre aide Rex M. Très apprécié. :) –

Questions connexes