修改列表中的按钮会更改原始按钮

时间:2018-01-07 15:05:06

标签: c# .net

每个按钮的文本可以由用户更改,我想分析按钮文本。我知道我可以把他们的文本放在一个字符串数组中但是,因为我想要更多属性,所以我想将它们放在List<Button>中。但是,问题在于每次我更改该列表中某个按钮的文本时,真实按钮的文本也会发生变化。

如何声明列表以便不更改原始按钮?

我测试了这个:

Button bt1 = A1;
Button bt2 = (Button)bt1;
bt1.Text = "A";
bt2.Text = "B";

但按钮的文字变为“B”。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是Buttonclass(即引用类型),因此,当您这样做时:

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,这是一种浪费。我强烈建议你使用字符串列表,除非你有充分的理由。