フローレイアウトパネル内のコントロールの並べ替え
-
06-07-2019 - |
質問
C#winformアプリケーションでflowlayoutPanelを使用すると問題が発生します。基本的に3つのセクションがあるフローレイアウトパネルです。
セクション#1は2つのコントロールのセットです。2つのドロップダウンコントロール。これらは常に同じ順序で、すべてのインスタンスで常に表示されます
セクション2は5つの異なるコントロールのセットです...一連の要因に基づいて、5つのコントロールのうち1つが表示され、他のすべてのコントロールは可視プロパティがfalseに設定されています
セクション#3は3つのコントロールのセットです。セクション#1と同様に、常に同じ順序で表示されます。
つまり、これは、セクション2が可変であり、その他は静的であるということです。
問題はセクション2にあります...コントロールの可視性を変更すると、それらはうまく表示されます(つまり、セクション1、次にセクション2、次にセクション3)...コンボボックスを設定する場合を除きますコントロールが表示されるように....その場合のみ、その場合のみ..順序は(セクション1、次にセクション3、次にセクション2)になります...順序が外れる原因がわからないその場合にのみ同期します。
メソッドの最初に基本的に行うことは、すべてのコントロールをVisible = falseに設定し、次にセクション1 Visible = trueを設定し、セクション2の条件をループして適切なコントロールVisible =を設定しますtrueで最後にセクション3コントロールVisible = trueを設定します。
フローレイアウトパネルコントロールの順序付けの経験はありますか? ComboBoxで何が起こっているのかわかりません。
解決
セクション2の別のflowlayoutpanelをドロップしてから、セクション2のコントロールをその中にドロップする方が簡単ですか?そうすれば、トップパネルに表示されるコントロールが変更されることはなく、順序を気にする必要もありません。
他のヒント
Inside FlowLayoutPanel.Controls
は、 SetChildIndex(Control c、int index)
と呼ばれるメソッド関数です。これにより、オブジェクトを特定のインデックスに設定できます。
FlowLayoutPanelはコントロールのインデックスを使用して描画する順序を決定するため、これをスワップしたいコントロールのインデックスに設定すると、そのコントロールのインデックスが1つずつ上がり、その後は1つずつ上がります。
ブログ FlowLayoutPanelでPictureBoxを並べ替える方法。
flowLayoutPanel1
という名前のWinFormにFlowLayoutPanelを追加します:
public partial class TestForm: Form
{
public TestForm()
{
InitializeComponent();
this.flowLayoutPanel1.AllowDrop = true
}
private void AddImageToBlog(System.Drawing.Image image)
{
PictureBox pbox = new PictureBox();
pbox.SizeMode = PictureBoxSizeMode.Zoom;
pbox.Height = (_picturebox_height * _ScaleFactor);
pbox.Width = (_picturebox_width * _ScaleFactor);
pbox.Visible = true;
pbox.Image = image;
pbox.MouseDown += new MouseEventHandler(pbox_MouseDown);
pbox.DragOver += new DragEventHandler(pbox_DragOver);
pbox.AllowDrop = true;
flpNewBlog.Controls.Add(pbox);
}
void pbox_DragOver(object sender, DragEventArgs e)
{
base.OnDragOver(e);
// is another dragable
if (e.Data.GetData(typeof(PictureBox)) != null)
{
FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;
//Current Position
int myIndex = p.Controls.GetChildIndex((sender as PictureBox));
//Dragged to control to location of next picturebox
PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));
p.Controls.SetChildIndex(q, myIndex);
}
}
void pbox_MouseDown(object sender, MouseEventArgs e)
{
base.OnMouseDown(e);
DoDragDrop(sender, DragDropEffects.All);
}
}
フローパネルでコントロールを並べ替え、コントロールの親プロパティを変更し、必要な順序で親プロパティを再割り当てできます。
ユーザーコントロールのプロパティに従ってコントロールを並べ替えることができるこの一般的なソリューションを試してください。
// When adding and removing controls, the order is not kept.
var runsOrderedByStartDate = this.nodesFlowLayoutPanel.Controls.Cast<RunNodeControl>().Select(_ => new { StartDate = _.StartDateTime, RunControl = _ }).OrderBy(_ => _.StartDate).ToList();
// Sets index of controls according to their index in the ordered collection
foreach (var anonKeyValue in runsOrderedByStartDate)
{
this.nodesFlowLayoutPanel.Controls.SetChildIndex(anonKeyValue.RunControl, runsOrderedByStartDate.IndexOf(anonKeyValue));
}
SetChildIndex
は、flowlayoutパネルのコントロールの順序をリセットしません。したがって、 FlowLayoutPanel.GetNextControl(q、true)
を実行すると、出力は正しくありません。
基本的なコントロールの順序付けの場合、flowlayoutPanelのコントロールの順序を制御する最も簡単な方法は、flowlayoutPanelのTabStopプロパティをtrueに設定することです。コントロールのtabstopプロパティをTrueに設定し、タブの順序をコントロールを表示する順序に設定します。