みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C# FlowLayoutPanelのコントロール

今、C#の学習でFlowLayoutPanelを使っていて、このパネル内にあるpictureboxの配置をマウスでドラッグ&ドロップして動かそうと思っているのですが未だ実装することができません。
どのようにすればpictureboxをドラッグして配置を変えることができるのでしょうか?

投稿日時 - 2013-01-19 10:12:55

QNo.7899135

困ってます

質問者が選んだベストアンサー

こんにちは。

ソースはざっくりした説明なので、改変してください。

(1)マウスダウン時に移動開始して
(2)マウスムーブに合わせて
(3)マウスダウン時に移動を終了、マウス位置によってFlowLayoutPanelの何番目かを判断

といった感じでどうでしょうか。


以下のサンプルはflowLayoutPanel1にpictureBox1からpictureBox3の3つのPictureBoxが横並びにある場合になります。
また、picureBox1が1番左にある場合に動かすことができます。
余計なものは入れず、考え方を説明できたらとおもいます。

public partial class Form1 : Form
{
private bool _onMoving = false; //ドラッグ中かどうか
private Point _mouseLocation = new Point(0, 0);
private Form _tempBox; //ドラッグ中のPictureBoxを見せるためのフォーム

public Form1()
{
InitializeComponent();
}



private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
var pictureBox = sender as PictureBox;

//フォームの設定をします。PictureBoxでもいいのですが、半透明処理なども考慮しこちらのほうが楽かと。
//背景にpictureBox1のImageなどを貼り付けてください。
_tempBox = new Form();

_tempBox.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
_tempBox.MinimumSize = new System.Drawing.Size(10, 10);
_tempBox.Size = pictureBox.Size;
_tempBox.BackColor = pictureBox.BackColor;
_tempBox.Visible = true;
_tempBox.Opacity = 0.5;
_tempBox.ShowInTaskbar = false;

_mouseLocation = e.Location;
_onMoving = true;

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_onMoving)
{
Point location = new Point(MousePosition.X - _mouseLocation.X, MousePosition.Y - _mouseLocation.Y);
_tempBox.Location = location;
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//ポジションの判定
//今回は横並びにのみ対応させました。ご自身のFlowLayoutPanelの状況にあわせて判定してください。
int pictureBox2CenterX = pictureBox2.Location.X + pictureBox2.Width / 2;
int pictureBox3CenterX = pictureBox3.Location.X + pictureBox3.Width / 2;

if (pictureBox2CenterX < e.X && e.X < pictureBox3CenterX)
{
flowLayoutPanel1.Controls.SetChildIndex(pictureBox1, 1);
}
else if (pictureBox3CenterX < e.X)
{
flowLayoutPanel1.Controls.SetChildIndex(pictureBox1, 2);
}

_onMoving = false;
_tempBox.Close();
}
}



ドラッグ中の描画が不要なようであれば、当然MouseMoveイベントの処理や_tempBox:フォームは要りません。
お役に立てれば幸いです。

投稿日時 - 2013-01-28 17:22:05

お礼

ありがとうございました!!
並べ替えで詰まっていて参考にさせていただきようやく列と行の両方の並べ替えをすることができました!!!

投稿日時 - 2013-03-19 18:28:37

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問