如何声明List<Button>以避免修改列表中按钮时影响原按钮?
解决按钮列表修改不影响原按钮的问题
嘿,我完全懂你的困扰!你遇到的核心问题是Button是引用类型——当你把原按钮赋值给列表里的变量时,其实并没有创建新的按钮对象,只是复制了指向原按钮的引用而已。所以不管你改列表里的按钮还是原按钮,本质上都是在修改同一个对象,自然会同步变化。
你之前的测试代码:
Button bt1 = A1; Button bt2 = (Button)bt1; bt1.Text = "A"; bt2.Text = "B";
之所以最终按钮文本是"B",就是因为bt1、bt2和A1全指向同一个Button实例,最后一次修改覆盖了之前的内容。
那怎么解决呢?给你两个实用的方案:
方案1:自定义数据类存储按钮属性(推荐)
既然你只需要按钮的部分属性(比如文本),没必要存整个Button控件。可以自己写一个类来封装需要的属性,这样列表里存的是独立的数据对象,和原按钮完全解耦:
// 自定义类,只包含你需要的按钮属性 public class ButtonInfo { public string Text { get; set; } public object Tag { get; set; } // 如果需要Tag属性就加 public string Name { get; set; } // 其他需要的属性都可以加 } // 初始化列表时,把原按钮的属性复制到自定义对象里 List<ButtonInfo> buttonInfos = new List<ButtonInfo> { new ButtonInfo { Text = A1.Text, Tag = A1.Tag, Name = A1.Name }, // 其他按钮依此类推 }; // 现在修改列表里的文本,原按钮完全不受影响 buttonInfos[0].Text = "新的按钮文本";
方案2:创建原按钮的克隆副本
如果你一定要在列表里存Button类型,那需要手动创建原按钮的独立副本,而不是直接赋值。因为Button控件没有内置的Clone方法,得自己写一个方法来复制需要的属性:
// 写一个克隆按钮的方法,复制你需要的所有属性 private Button CloneButton(Button originalBtn) { Button clonedBtn = new Button(); // 复制核心属性 clonedBtn.Text = originalBtn.Text; clonedBtn.Name = originalBtn.Name; clonedBtn.Tag = originalBtn.Tag; clonedBtn.Size = originalBtn.Size; // 其他你需要的属性都可以在这里复制 return clonedBtn; } // 初始化列表时,存入克隆后的按钮 List<Button> buttonList = new List<Button> { CloneButton(A1), // 其他按钮克隆后加入列表 }; // 现在修改列表里的按钮文本,原按钮A1的文本不会改变 buttonList[0].Text = "修改后的文本";
这两个方案都能实现你要的“修改列表项不影响原按钮”的效果,推荐用方案1,因为更轻量,也避免了不必要的控件实例开销。
内容的提问来源于stack exchange,提问作者Mohsen Nemati
相关产品推荐
相关产品推荐

