2017-01-06 24 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

相關問題