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:
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
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. –
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? –