2017-10-05 3 views
1

J'utilise WinForms dans VS15 avec C#.Les boîtes de texte ajoutées par programme ne s'affichent pas

J'ajoute dynamiquement TextBox s et Label s à mon Form sur la base d'un utilisateur valeur sélectionnée dans un ComboBox (essentiellement cette recherche une valeur dans une collection de données qui indique mon interface utilisateur ce contrôle dont il a besoin).

Lorsque je tente de générer les contrôles, les Label apparaissent et la disposition est correcte, cependant, les TextBox s sont remarquables en l'absence.

J'ai essayé de faire des commentaires avec les propriétés MaximumSize et MinimumSize pour voir si elles pouvaient jouer avec quelque chose, mais cela ne semble pas faire de différence.

Le code que j'utilise pour ce faire est ci-dessous (je sais que l'utilisation du List<Pair<Label,TextBox>> est assez unecessary mais je trouve ça aide la lisibilité):

private void GenerateControls(string formType) 
    { 
     string[] formParameters = engine.GetFormParameters(formType); 
     if (formParameters == null) return; 
     SplitterPanel panel = splitContainer.Panel1; 
     panel.Controls.Clear(); 
     List<Pair<Label, TextBox>> controlPairs = new List<Pair<Label, TextBox>>(); 
     int tabIndex = 0; 
     Point labelPoint = panel.Location + new Size(20, 20); 
     Size initialOffset = new Size(0, 30); 
     Size horizontalOffset = new Size(40, 0); 
     Size tBoxSize = new Size(40,20); 
     foreach (string parameter in formParameters) 
     { 
      Label label = new Label 
      { 
       Text = parameter, 
       Tag = "Parameter Label", 
       Name = $"lbl{parameter}", 
       Location = (labelPoint += initialOffset) 
      }; 
      TextBox textBox = new TextBox 
      { 
       AcceptsTab = true, 
       TabIndex = tabIndex++, 
       Text = "", 
       Tag = parameter, 
       Name = $"txt{parameter}", 
       MaximumSize = tBoxSize, 
       MinimumSize = tBoxSize, 
       Size = tBoxSize, 
       Location = labelPoint + horizontalOffset 
      }; 
      controlPairs.Add(new Pair<Label, TextBox>(label, textBox)); 
     } 

     foreach (Pair<Label, TextBox> pair in controlPairs) 
     { 
      panel.Controls.Add(pair.First); 
      panel.Controls.Add(pair.Second); 
     } 
    } 

Je ne crois pas que mon utilisation de Point + Size est la question de la classe Point remplace l'opérateur + comme ceci:

Point+

+1

Quel est le but de controlPairs? Ajoutez simplement les contrôles dans la première boucle. Utilisez le débogueur pour afficher vos informations de localisation. – LarsTech

+0

J'ai dit dans ma question que je pense que cela aide à la lisibilité du code, je sais que c'est une construction largement inutile et il sera supprimé une fois que je l'ai exécuté. En ce qui concerne les emplacements, je reçois les étiquettes à (20; Y) et les zones de texte à (60; Y) qui me semble bien à moins que je ne manque quelque chose. –

+0

La classe 'Point' remplace l'opérateur' + 'de sorte que' Point + Size = Point'. Les étiquettes utilisent la même méthode pour déterminer leur emplacement, elles semblent fonctionner correctement. D'autres idées? –

Répondre

1

Malheureusement pour moi, la question semble être simplement que le dX était n Si la valeur est trop grande pour éviter que les zones de texte ne soient cachées sous les étiquettes, j'ai oublié que les étiquettes n'ont pas d'arrière-plans transparents.

Pendant que j'étais là: j'ai supprimé le redondant List<Pair<<>>; Ajout de la prise en charge de l'ajustement dynamique de l'emplacement TextBox en fonction de la taille Label; et diviser en deux boucles distinctes, de sorte que mon code ressemble maintenant à ci-dessous et fonctionne très bien:

private void GenerateControls(string formType) 
    { 
     string[] formParameters = engine.GetFormParameters(formType); 
     if (formParameters == null) return; 
     SplitterPanel panel = splitContainer.Panel1; 
     panel.Controls.Clear(); 
     int tabIndex = 0; 
     Point labelPoint = panel.Location + new Size(20, 20); 
     Size verticalOffset = new Size(0, 30); 
     Size tBoxSize = new Size(200,20); 
     int maxLabelLength = 0; 
     foreach (string parameter in formParameters) 
     { 
      Label label = new Label 
      { 
       Text = parameter, 
       Tag = "Parameter Label", 
       Name = $"lbl{parameter}", 
       Location = (labelPoint += verticalOffset), 
       AutoSize = true 
      }; 
      panel.Controls.Add(label); 
      if (label.Size.Width > maxLabelLength) 
      { 
       maxLabelLength = label.Size.Width; 
      } 
     } 
     Size horizontalOffset = new Size(maxLabelLength + 30, 0); 
     labelPoint = panel.Location + new Size(20, 20) + horizontalOffset; 
     foreach (string parameter in formParameters) 
     { 
      TextBox textBox = new TextBox 
      { 
       AcceptsTab = true, 
       TabIndex = tabIndex++, 
       Text = "", 
       Tag = parameter, 
       Name = $"txt{parameter}", 
       MaximumSize = tBoxSize, 
       MinimumSize = tBoxSize, 
       Size = tBoxSize, 
       Location = labelPoint += verticalOffset 
      }; 
      panel.Controls.Add(textBox); 
     } 

    } 

Merci à tous ceux qui ont aidé!