2017-01-06 6 views
0

1つのコントロール変数から複数のコントロール(この場合はパネル)を作成しようとしています。つまり、ボタンを押すと、1つのPanel変数を使用して異なる場所に3つのパネルが表示されます。現在のコードは次のようになります1つのコントロール変数から複数のコントロールを生成する方法

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の位置に目的のプロパティを持つ1つのパネルが作成されます。 2回目のボタンを押すと、0、60のパネルが作成されますが、最初のパネルは削除されます。 3回目にボタンを押すと、位置0,120にパネルが作成され、パネル2が削除されます。

これは私が欲しいものではありません。私はパネル1とパネル2を残し、削除しないようにしたい。 1つの変数から複数のコントロールを作成して、どのメソッドでもアクセスでき、作成時に他のコントロールを削除しないでください。

+0

それは第一パネルを削除しませんが、それだけで新しい場所に移動をクリックします。あなたが達成しようとしていることを聞かせてもらえますか?なぜ、複数のPanelコントロールへの参照を保持するために変数を1つだけ使用しなければならなかったのですか? –

+0

私は予定リストアプリを作っています。あなたがしなければならないことを入力すると、ラベルの中に入力されたテキストを含むパネルが作成されます。すべてのパネルが同じように見えるので、1つの変数を使用したい、ラベルはそれらを含む異なるテキストを持つことになります。データを保存すると、同じ変数を何度も繰り返し入力することができなくなります。 – 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 
をクリックしてください

作成したすべてのパネルをに保存しますとそこからアクセスしてください

+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); 
    ... 

そして、あなたはリストはあなたに数MyPanels.Count

+0

どうすれば私のメソッド外の変数にアクセスできますか? – unknown

+0

そのクラス内の他のメソッドの場合、MyPanelsはそのクラスのメンバーであり、そのメソッドはそれを参照できます。リスト内のアイテムを参照する方法を尋ねる場合は、リストの使い方を知りたいでしょう。あなたはここに行くことができます:https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx – AgapwIesu

+0

実際には、@ファビオの答えが良いです。 panelIWantToCreateTheControlsOn.Controlsに既にパネルのリストがあります。だからあなたは自分のリストを作成する必要は全くありません。他の方法でアクセスする必要がある場合は、アクセスするだけです。あなた自身のハンドルが必要な場合は、リストまたは辞書(Fabioの示唆どおり)がそのトリックを行います。 – AgapwIesu

関連する問題