每个按钮的文本可以由用户更改,我想分析按钮文本。我知道我可以把他们的文本放在一个字符串数组中但是,因为我想要更多属性,所以我想将它们放在List<Button>
中。但是,问题在于每次我更改该列表中某个按钮的文本时,真实按钮的文本也会发生变化。
如何声明列表以便不更改原始按钮?
我测试了这个:
Button bt1 = A1;
Button bt2 = (Button)bt1;
bt1.Text = "A";
bt2.Text = "B";
但按钮的文字变为“B”。
答案 0 :(得分:1)
您遇到的问题是Button
是class
(即引用类型),因此,当您这样做时:
List<Button> list = new List<Button> { button1 };
list[0].Text = "A";
您没有修改列表中的对象,而是在修改button1
(因为您添加了对button1
的引用)。如果您不希望发生这种情况,则需要在将每个按钮添加到列表时创建每个按钮的副本
你可以使用这样的东西来完成它:
List<Button> list = Controls
.OfType<Button>()
.Select(x => new Button
{
//copy the properties you want, for example:
Text = x.Text,
Name = x.Name
})
.ToList();
这样,由于您要为每个Button
创建新实例,因此引用不相同,因此原始对象将保持不变。当然,对原始对象的任何更改都不会反映在这些新对象中。
如果您不想使用LINQ,可以使用更加手动的方法:
List<Button> list = new List<Button>();
list.Add(new Button { Text = btn1.Text, Name = btn1.Name, /* etc */ });
答案 1 :(得分:0)
将所有9个按钮放在父控件/视图中。然后,根据您使用的技术,获取该父级的所有子控件/视图,调用OfType<Button>()
并将其转换为列表。
例如,在WinForms中,这将是:
var listOfButtons = this.Controls.OfType<Button>().ToList();
编辑:我刚看了你的评论:
我的问题是如何获得按钮列表,如果更改列表中每个按钮的文本,真正按钮的文本不会改变
然后你真的不需要按钮列表。你真的只需要一个字符串列表。
var listOfButtonText = this.Controls.OfType<Button>()
.Select(x => x.Text).ToList();
然后您可以随意更改文本,但不会影响实际按钮的文本:
listOfButtonText[0] = "Foo";
我觉得在这里使用按钮的新实例没什么好处。应该显示按钮。创建新按钮只是为了弄乱他们的Text
,这是一种浪费。我强烈建议你使用字符串列表,除非你有充分的理由。