문제

C# winform 응용 프로그램에서 flowlayoutPanel을 사용하는 데 문제가 있습니다.제가 기본적으로 가지고 있는 것은 3개의 섹션이 있는 흐름 레이아웃 패널입니다.

섹션 #1은 2개의 컨트롤 세트입니다..두 개의 드롭다운 컨트롤은 항상 동일한 순서로 모든 인스턴스에 항상 표시됩니다.

섹션 #2는 5개의 서로 다른 컨트롤 세트입니다.일련의 요인에 따라 5개의 컨트롤 중 1개가 표시되고 다른 모든 컨트롤은 Visible 속성이 false로 설정됩니다.

섹션 #3은 3개의 컨트롤로 구성된 세트입니다.섹션 #1과 마찬가지로 항상 같은 순서로 표시되며 항상 표시됩니다.

따라서 이것이 요약되는 것은 섹션 #2가 가변적이고 나머지는 정적이라는 것입니다.

문제는 섹션 #2에서 발생합니다.컨트롤의 표시 여부를 변경하면 정상적으로 표시됩니다(I.E....섹션 1, 섹션 2, 섹션 3) ...콤보박스 컨트롤을 표시로 설정한 경우를 제외하고는 ....그 경우에만 ..순서는 (섹션 1, 섹션 3, 섹션 2)입니다.이 경우 주문이 동기화되지 않는 원인이 무엇인지 알 수 없습니다.

기본적으로 메서드 시작 시 수행하는 작업은 모든 컨트롤을 Visible = false로 설정하는 것입니다.그런 다음 섹션 1 Visible = true로 설정합니다.그런 다음 섹션 2의 조건을 반복하고 적절한 컨트롤 Visible = true를 설정하고 마지막으로 섹션 3 컨트롤 Visible = true를 설정합니다.

흐름 레이아웃 패널 제어 순서에 대한 경험이 있는 사람이 있습니까?ComboBox에서 무슨 일이 일어나고 있는지 알 수 없습니다.

도움이 되었습니까?

해결책

섹션 2에 대해 다른 FlowLayoutPanel을 삭제하는 것이 더 쉬운 후 섹션 2 컨트롤을 그 안에 삭제 할 수 있습니까? 이렇게하면 상단 패널의 보이는 컨트롤이 변경되지 않으며 주문에 대해 걱정할 필요가 없습니다.

다른 팁

내부에 FlowLayoutPanel.Controls 호출 된 메소드 함수입니다 SetChildIndex(Control c, int index) 이를 통해 개체를 특정 인덱스로 설정할 수 있습니다.

FlowLayoutPanel은 컨트롤 지수를 사용하여 어떤 순서를 그려야하는지 결정할 수 있으므로, 교체하려는 컨트롤의 색인으로 설정할 수 있으며, 컨트롤 인덱스를 하나씩, 그 이후로 인덱스를 충돌시킬 수 있습니다.

여기 내 스 니펫이 있습니다 블로그 FlowLayoutPanel에서 PictureBox를 재정렬하는 것.

이름이 지정된 WinForm에 FlowLayoutPanel을 추가하십시오 flowLayoutPanel1:

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);
    }
}

FlowPanel에서 컨트롤을 재정렬, 컨트롤의 부모 속성 변경 및 필요한 순서로 부모 속성을 재 할 수 있습니다.

사용자 컨트롤의 속성에 따라 컨트롤을 정렬 할 수있는이 일반 솔루션을 사용해보십시오.

// 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로 설정하고 탭 순서를 컨트롤이 표시되는 순서로 설정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top