如何为动态生成的CheckBox设置显示文本?
问题原因及解决方法
你的核心问题是重复使用同一个CheckBox实例:代码里仅在循环外创建了一个CheckBox对象,循环中只是不断修改它的Text属性再添加到CheckedList中。由于所有列表项指向的都是同一个对象,最终所有项的文本都会被最后一次设置的值覆盖,同时CheckedList对重复添加同一控件的处理逻辑会导致文本无法正常显示。
修正后的代码
把CheckBox的创建逻辑放到循环内部,每次循环生成新的实例:
public void GetAttributs() { List<string> lstAttributs = new List<string>(); lstAttributs.Add("Alifère: capacité de voler à x mètres d'altitude"); lstAttributs.Add("Amphibien: capacité de nager à x mètres de profondeur, peut respirer sous l'eau et sur la terre"); lstAttributs.Add("Armure naturelle: peau épaisse, jusqu'à x% de dégâts physiques absorbés par l'ennemi"); lstAttributs.Add("Avantage du terrain: sur x terrain(s), la créature n'a pas de malus"); lstAttributs.Add("Célérité: attaque toujours en premier lors de tour d'initiative"); lstAttributs.Add("Corps artificiels: créature artificielle, nul besoin pour elle de respirer"); lstAttributs.Add("Dégagement: impossible d'être encerclé"); lstAttributs.Add("Double frappe: capacité d'attaquer deux fois par tour de jeu"); lstAttributs.Add("Fin limier: plafond supplémentaire de 5% dans une des compétences techniques"); lstAttributs.Add("Frigifugé: capacité de survivre à basse température jusqu'à x degrés Celsius"); lstAttributs.Add("Gros dormeur: temps de récupération divisé par deux lors de repos"); lstAttributs.Add("Hyperesthésie: chance de ne pas être empoisonné égale à x%"); lstAttributs.Add("Ignifugé: capacité de survivre à haute température jusqu'à x degrés Celsius"); lstAttributs.Add("Insubmersible: impossible d'être submergé"); lstAttributs.Add("Lourdaud: trop lourd pour attaquer en premier, attaque en dernier"); lstAttributs.Add("Mithridatisation: chance de ne pas être empoisonné égale à x%"); lstAttributs.Add("Mort-vivant: ne peut pas être soigné par des moyens conventionnels (sauf repos), est obligé de dévorer un corps ou boire des fluides corporels"); lstAttributs.Add("Porteur de charges lourdes: capacité de porter 25% la charge maximum que l'on peut porter"); lstAttributs.Add("Prodige: plafond supplémentaire de 5% dans une des compétences naturelles"); lstAttributs.Add("Régénération spirituelle: à chaque début de tour, 10% de l'énergie est régénérée par le lanceur"); lstAttributs.Add("Régénération vitale: à chaque début de tour, 10% de PV régénérés pour le lanceur"); lstAttributs.Add("Soif de bataille: plafond supplémentaire de 5% dans une des compétences de combat"); lstAttributs.Add("Souffle: la créature est capable de cracher du feu ou n'importe quel autre élément (dégâts non magiques)"); lstAttributs.Add("Vague de panique: fais trop peur, les adversaires doivent réussir un jet de Volonté tous les x tour(s) pour agir, mais peuvent toujours esquiver en cas d'échec"); lstAttributs.Add("Voie libre: capacité de déplacement doublée lorsque le terrain est dégagé."); for(int i = 0; i < lstAttributs.Count; i++) { // 每次循环创建新的CheckBox实例 CheckBox checkBox = new CheckBox(); checkBox.Text = lstAttributs[i]; chckLstAttributs.Items.Add(checkBox); } }
更优方案(WinForms场景)
如果使用的是WinForms的CheckedListBox,其实无需手动创建CheckBox控件——它本身的设计就是直接添加字符串项,自动生成带复选框的列表项,代码更简洁且不易出错:
public void GetAttributs() { List<string> lstAttributs = new List<string>(); // 省略字符串添加逻辑,同上 // 直接将字符串列表添加到CheckedListBox的Items中 chckLstAttributs.Items.AddRange(lstAttributs.ToArray()); }
内容的提问来源于stack exchange,提问作者Mulos
相关产品推荐
相关产品推荐

