2017-01-06 27 views
0

生成多个控件我试图创建多个控件(在这种情况下面板)从一个控制变量。我的意思是当我按下一个按钮时,3个面板使用一个Panel变量出现在不同的位置。我目前的代码如下所示如何从一个控制变量

Panel panel = new Panel(); 
int panel_LOC = -60; 
int i; 

private void button1_Click(object sender, EventArgs e) 
{ 
    i = i + 1; 
    pane1_LOC = panel_LOC + 60; 
    panel.Location = new Point(0, panel_LOC); 
    panel.Name = "panelName_" + i.ToString(); 

    panel.Width = 1052; 
    panel.Height = 50; 
    panel.BackColor = Color.FromArgb(222, 222, 222); 

    panelIWantToCreateTheControlsOn.Controls.Add(panel); 
} 

当我按下按钮时,它会在位置0,0创建一个具有所需属性的面板。当我第二次按下按钮时,它会在位置0,60创建一个面板,但是它将删除第一个面板。当我按下按钮第三次它产生在位置0,120面板和它再次删除面板2.

这不正是我想要的。我希望面板1和面板2保持不被删除。如何从一个变量创建多个控件,我可以在每个方法中访问该变量,并且不会删除创建时的其他控件。

+0

它不会删除第一个面板,它只是将其移动到新位置。请问你想要达到什么目的?为什么你跌倒了,你只能使用一个变量来保存对多个面板控件的引用? –

+0

我正在做一个待办事项列表的应用程序。你输入你必须要做的事情,然后它创建一个在标签内输入文字的面板。我想使用一个变量,因为所有面板看起来都是一样的,标签只会包含不同的文本。它保存数据,并防止我一次又一次地输入相同的变量。 – unknown

+0

我的意思是,当我有这样的代码:Panel panel1 = new Panel();面板panel2 =新面板();等等。这会很有效,因为它需要我在50次左右的时间内完成。我不能使用选项卡控件或任何其他控件,因为它们看起来不如平面面板。我应该看看未来的自定义控件我知道 – unknown

回答

0

尝试实例化按钮单击事件中的对象。这样一个新的对象,每次创建单击该按钮

Panel panel = new Panel();      //<<<<<<MOVE THIS LINE 
int panel_LOC = -60; 
int i; 

private void button1_Click(object sender, EventArgs e) 
{ 
    i = i + 1; 
    Panel panel = new Panel();     //<<<<<<TO HERE 
    pane1_LOC = panel_LOC + 60; 
    panel.Location = new Point(0, panel_LOC); 
    panel.Name = "panelName_" + i.ToString(); 

panel.Width = 1052; 
panel.Height = 50; 
panel.BackColor = Color.FromArgb(222, 222, 222); 

panelIWantToCreateTheControlsOn.Controls.Add(panel); 

}

+0

这意味着我无法访问button1_Click方法之外的面板变量 – unknown

0

panel你的情况参考始终以同一个实例,因此,而不是创建新实例,您只需更新现有的一个属性。

因为你已经有面板中的所有“硬编码”的价值观 - 你只需要创建面板的新实例。

对于访问Panel变量外,你可以创建一个面板

private Panel CreatePanel(string name, int locationY) 
{ 
    var panel = new Panel(); 

    panel.Location = new Point(0, locationY); 
    panel.Name = name; 

    panel.Width = 1052; 
    panel.Height = 50; 
    panel.BackColor = Color.FromArgb(222, 222, 222);  

    return panel; 
} 

然后创建创建方法面板按钮,点击

int panel_LOC = -60; 
int i; 

private void button1_Click(object sender, EventArgs e) 
{ 
    i = i + 1; 
    var panelName = $"Panel {i}"; 
    panel_LOC += 60; 

    var panel = CreatePanel(panelName, panel_LOC); 
    panelIWantToCreateTheControlsOn.Controls.Add(panel); 
} 

然后你就可以按钮的外部访问面板中点击

private Panel GetPanelByName(strinig panelName) 
{ 
    return panelIWantToCreateTheControlsOn.Controls 
              .OfType<Panel>() 
              .FirstOrDefault(control => control.Name.Equals(panelName)); 
} 

var panel2 = GetPanelByName("Panel 2"); 
// use panel 

或者所有已创建的面板保存到Dictionary<string, Panel>并从那里

+0

这是不行的,因为我需要访问button1_Click方法之外的面板变量。如果我把变量放在button1_Click方法中,我无法使用其他方法访问它 – unknown

+0

@unknown,那么你总是可以把它变成一个类的字段? – Clint

+0

@unknown,检查更新的答案 – Fabio

0

访问它们实际上你需要创建一个新的面板,并使用列表来跟踪它们,你的方法之外。

List<Panel> MyPanels = new List<Panel>(); 
int panel_LOC = -60; 

private void button1_Click(object sender, EventArgs e) 
{ 
    Panel panel = new Panel(); 
    MyPanels.Add(panel); 
    panel_LOC = panel_LOC + 60; 
    panel.Location = new Point(0, panel_LOC); 
    ... 

而且你也不需要保持一个变量i计数板,因为名单会给你算MyPanels.Count

+0

那么我如何访问我的方法之外的变量? – unknown

+0

如果是该类中的其他方法,那么MyPanels是该类的成员,并且其方法可以引用它。如果您在询问如何引用列表中的项目,您将需要了解如何使用列表。你可以去这里:https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx – AgapwIesu

+0

其实,@ Fabio的答案是更好的。您已经拥有panelIWantToCreateTheControlsOn.Controls中面板的列表。所以你根本不需要创建自己的列表。如果您需要通过其他方法访问它们,您只需通过它访问它们即可。如果你需要自己的句柄给他们,无论是一个列表或字典(如法比奥建议)将做的伎俩。 – AgapwIesu

相关问题