2017-07-31 6 views
1

イベントを追加する方法についての記事がパネル上をドラッグできるようになっています。しかし、どのように私は動的に作成されたパネルを通じてこれを達成するだろうか?動的に作成されたパネルをドラッグすることができる

Panel pn = wch.GenerateWorkspaceControl(space.Name, space.Name, p); 
      PanelTest.Controls.Add(pn); 

     public Panel GenerateWorkspaceControl(string gbTitle, string gbName, Point gbPos) 
    { 
     Panel pnl = GeneratePanelContainer(gbPos, new Size(300, 200)); 
     pnl.Controls.Add(GenerateLabel(gbName,new Point(100,1),new Size(135,115))); 
     return pnl; 
    } 

private Panel GeneratePanelContainer(Point loc, Size size) 
    { 
     return new Panel() { BackColor = Color.Transparent, BorderStyle = BorderStyle.FixedSingle, Location = loc, Size = size }; 
    } 

生成パネルコンテナにイベントハンドラを追加しますか?

私は動的に作成された複数のパネルを保持しているパネルを持っています。私はメインパネルの中でダイナミックに作成されたパネルの周りを移動することができるようにしたい。

アイデア?

+0

はい、 'pnl。 MouseMove + = pnl_MouseMove; 'このメソッドを作成し、送信者オブジェクトをパネルにキャストします。 – LarsTech

+0

これらのパネルにイベントまたはラムダの集合を書くことも、パネルを登録するMoveControllerクラスを作成することもできます。 (私は後者が好きです) – TaW

答えて

0

任意のコントロールを移動可能にするクラスです。

単にそれを登録します。

MoveController.RegisterCtl(button1); 

今、あなたはコントロールを移動することができます。..

が完了したら、あなたはまた、コントロールの登録を解除することができます:ここで

MoveController.UnRegisterCtl(button1); 

は、コントローラクラスです:

static class MoveController 
{ 
    static List<Control> Controls = new List<Control>(); 
    static Control curCtl = null; 
    static Point curStart = Point.Empty; 

    static public void RegisterCtl(Control ctl) 
    { 
     Controls.Add(ctl); 
     ctl.MouseDown += ctl_MouseDown; 
     ctl.MouseMove += ctl_MouseMove; 
     ctl.MouseUp += ctl_MouseUp; 
    } 

    static public void UnRegisterCtl(Control ctl) 
    { 
     if (Controls != null && Controls.Contains(ctl)) 
     { 
      Controls.Remove(ctl); 
      ctl.MouseDown -= ctl_MouseDown; 
      ctl.MouseMove -= ctl_MouseMove; 
      ctl.MouseUp -= ctl_MouseUp; 
     } 
    } 

    static void ctl_MouseDown(object sender, MouseEventArgs e) 
    { 
     curCtl = (Control)sender; 
     curStart = curCtl.Location; 
    } 

    static void ctl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (curCtl != null) 
     { 
      curCtl.Left += e.Location.X - curCtl.Width/2; 
      curCtl.Top += e.Location.Y - curCtl.Height/2; 
     } 
    } 

    static void ctl_MouseUp(object sender, MouseEventArgs e) 
    { 
     curCtl = null; 
    } 
} 
+0

おかげで、私はあなたのポストに非常に似た何かをすることによってそれを働かせました。学校でこのことを学んだことはありません。また、コントロールやイベントを完全に理解していない人が私を落胆させたので、私は投稿できません。 idk。しかし、私はこれらのコメントであなたに尋ねることができるかどうか別の質問がありましたか?イベントに別のイベントを発動させるのは悪い習慣ですか?コンボボックスのcustomindexchangedイベントのようにイベントを発生させてラベルを変更します。 – sublimeaces

+0

時には私は自分自身がこれをやっていると感じることがありますが、私は通常それを訂正し、コードを書くべきであると思います。ルールには以下のようなものがあります:コントロールイベントには長いコードは入れないでください。代わりに、彼らは仕事をする関数(いい名前で)を呼び出す必要があります。 – TaW

+0

例:SaveButtonは保存しないでください。 saveData関数を呼び出す必要があります。 SaveDataMenuItemはsaveButtonClickではなく同じ関数を呼び出す必要があります。 GUIを変更してOkButtonを削除したいときは、コードチェンジは必要ありません。より広い文脈では、これはビューとモデルの分離です。そうです:はい、それは悪い習慣ですが、時にはそれに入っていくこともあります。 – TaW

関連する問題