星期一, 11月 03, 2014

[C#] FlowLayoutPanel

之前練習動態物件加入 container 時,最令人討厭的,莫過於要計算控件位置,現在才發現 Winform 有 FlowLayoutPanel 控件可以解決計算位置這個問題,這篇就利用 FlowLayoutPanel 來作每 5 個控件一欄的練習,並把 CheckedChanged 事件進行註冊,當點選 CheckBox 時,必須顯示現在勾選哪一個 CheckBox

FlowLayoutPanel MSDN 說明
FlowLayoutPanel 控制項會以水平或垂直流向來排列它的內容。 其內容可以從某一資料列換行至下一個資料列,或從某一資料行換行至下一個資料行。 此外,也可裁剪該內容而不換行。
namespace FlowLayoutPanelDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 使用者輸入預設值
            numInput.Value = 10;
            // FlowDirection 預設值為 LedtToRight 
            flowDemo.FlowDirection = FlowDirection.TopDown;
            // WrapContents 預設值為 true
            flowDemo.WrapContents = true;
            // 設定 FlowLayoutPanel 具有 Scroll 功能
            flowDemo.AutoScroll = true;
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            decimal count = numInput.Value;
            if (count <= 0) return;

            // 避免重覆操作,無法顯示正確結果
            flowDemo.Controls.Clear();

            for (int i = 1; i <= count; i++)
            {
                CheckBox cb = new CheckBox();
                cb.Name = "cb" + i;
                cb.Text = "cb" + i;
                cb.CheckedChanged += cb_CheckedChanged;

                // 預設是碰到 FlowLayoutPanel Border 時會自動折行
                // 在這改用每 5 個控件就進行折行
                if (i % 5 == 0)
                    flowDemo.SetFlowBreak(cb, true);

                flowDemo.Controls.Add(cb);
            }
        }

        void cb_CheckedChanged(object sender, EventArgs e)
        {
            lblMessage.Text = string.Format("{0} 正被勾選", ((CheckBox)sender).Name);
        }
    }
}
[C#] FlowLayoutPanel

沒有留言:

張貼留言