2

私のアプリは、新しいフォーム要素を動的に作成して操作できる必要があります。現在、ボタンとラベルが入ったパネルがあります。これを複製してアプリに表示し、操作できるようにする必要があります。

たとえば、私はpanel1を持っています。中にはlabel1、button1、button2があります。ラベル1は秒単位でカウントアップします。button1をクリックすると、label1がカウントアップを開始します。button2をクリックすると、タイマーが停止します。私の問題は、panel1を何度も複製し、新しいボタンを正しいラベルに対応させる必要があることです。

の上button_click

private void button1_Click(object sender, EventArgs e)
{
   Button theSender = (Button)sender;
   Panel parentPanel = (Panel)theSender.Parent;
}

ここから、子コントロールをターゲットにすることはできません。私はjQueryでのターゲティングと処理に慣れているので、自分自身を説明するための正しいC#用語さえ知りません。

4

5 に答える 5

3

問題を正しく理解している場合は、aUsercontrolを使用して作成し、、などを入力することをお勧めPanelします。ユーザーコントロールにボタンのイベントを書き込みます。次に、このユーザーコントロールをフォームに導入すると、機能するはずです。フォームには任意の数のユーザーコントロールを導入でき、各ボタンはそのユーザーコントロールのラベルに対してのみ動作/機能します。LabelButton

あなたがwinformsに不慣れで、私が何を言っているのかわからないと言ったように、私に知らせてください。十分な時間があれば私が助けます。

それが役に立てば幸い。

于 2013-01-22T07:17:13.557 に答える
1

コントロールの子には、Control.Contrtolsコレクションを使用してアクセスできます。たとえば、フォームのボタンにアクセスします。

Button btn = this.Controls["button1"]; 

ただし、これは、button1がフォームに直接配置され、button1.Nameプロパティが「button1」に設定されている場合にのみ当てはまります(デザイナーは自動的にこれを行います。コントロールを動的に作成する場合は、コントロールに自分で名前を付ける必要があります)。

パネル1の子コントロールなど、任意のコントロールの子コントロールを列挙することもできます。

foreach(Control c in panel1.Controls)
{
// do something, e.g.
   if(c is Label){//do sth...}
   if(c.Name.Equals("label1") && c is Label)
   {
      Label l = c as Label;
   }
}

@rapsalandsが言ったように、UserControlがあなたの答えかもしれません。

于 2013-01-22T07:17:16.583 に答える
0

このためのユーザーコントロール(UserControl)を作成します。ControlとUserControlの違いの詳細については、この記事を確認してください。

コントロールとUserControlは簡単に複製でき、すべての機能があります。

于 2013-01-22T07:18:47.360 に答える
0

他のオブジェクトと同じように、コードで新しいUIコントロールを作成できます。Button b = new Button();

次に、を使用してそれらをフォームに追加できますform.Controls.Add(b)。コントロールの配置とサイズ設定も行い(これを行うために使用できるプロパティがあります)、を使用してイベントハンドラーを接続する必要がありますb.Clicked += form.button_click;

この例を確認するには、Visual Studioで生成されたdesigner.csファイルを確認してみてください(変更せずに、確認してください)。最初は非常に複雑に見えますが、Windowsフォームをわかりやすく説明するのに役立つ可能性があり、そこに設定する必要のあるすべてのプロパティを見つけることができます。

デザイナで何かを更新するたびに、Visual Studioは新しいコードを生成し、それをdesigner.csファイルに配置します。InitializeComponent()フォーム全体は、フォームのコンストラクターから呼び出されるメソッドで設定されます。そのコードの一部をコピーできるはずであり、いくつかの変更を加えることで、独自の動的UI要素を作成するためにそれを使用できます。

rapsalandsが言うように、ユーザーコントロールは、必要な機能をカプセル化するのに役立つため、この状況で役立つように思われます。ただし、頭を丸めるには少し時間がかかる場合があり、今のところ、新しいコントロールを作成せずにフォーム内のすべてを実行する方が簡単な場合があります。

于 2013-01-22T07:33:03.427 に答える
0

ですから、あなたは初心者でありUsercontrol、前の回答で述べたように、理解するのに少し時間が必要です。Constructorフォームのorイベントでforループを使用して、Loadコントロールを動的に生成します。

Panel panel;
Label label;
Button button1;
Button button2;

for(int i = 0; i > count; i++)
{
    panel = new Panel();
    button1 = new Button();
    button2 = new Button();
    label = new Label();

    panel.Controls.Add(button1);
    panel.Controls.Add(button2);
    panel.Controls.Add(label);
    Controls.Add(panel);

    button1.Click += Event1;
    button2.Click += Event2;
}

private void Event1()
{
    label.Text = "Button 1 Clicked."
}
private void Event2()
{
    label.Text = "Button 2 Clicked."
}

このようにして、確かに必要な数のコントロールを作成でき、目的も果たします。いくつかの変数を使用して、パネルコントロールを適切に配置します。コントロールのforループに追加するプロパティを設定します。

これは私の以前の答えの単なる代替案です。私はまだ私によって与えられた前の答えをお勧めします。このコードはダミーであり、テストされていません。

それが役に立てば幸い。

于 2013-01-22T09:27:24.493 に答える