windows窗体 三类panel 面板的区别和使用方法

在windows窗体程序设计中,我们有时需要将多个控件放在窗体内的一个容器中以期望达到更好的UI效果和交互体验,这时我们使用微软为我们提供的panel 组件来实现这样的功能。panel组件共分为三大类:Panel,FlowLayoutPanel,TableLayoutPanel。
(本人也是刚接触使用C#进行windowns窗体程序的开发,对于很多控件和组件的名称和叫法不是很明白和熟悉,姑且就做面板组件板)

Panel

基本面板容器可以理解成类似安卓的绝对对局,当你设置一个控件的坐标属性时,这个控件就会在面板的相对位置显示。


Paste_Image.png

如上图所示,当点击 panel 按钮时,主窗体将会多显示出三个小的Button;下面是示例代码:

 class PanelExample
    {
        public Panel panel = new Panel();
        public PanelExample()
        {
            Button bt = new Button();
            bt.Text = "Button";
            bt.Location = new System.Drawing.Point(10,10);
            Button bt_1 = new Button();
            bt_1.Text = "Button1";
            bt_1.Location = new System.Drawing.Point(bt.Size.Width + 20, 10);
            Button bt_2 = new Button();
            bt_2.Text = "Button2";
            bt_2.Location = new System.Drawing.Point(bt_1.Location.X + bt_1.Size.Width + 20, 10);
            panel.Controls.Add(bt);
            panel.Controls.Add(bt_1);
            panel.Controls.Add(bt_2);
        }
    }

先声明一个panelExample类,类中包含了成员变量 panel以及类的构造方法,在构造方法中,使用Controls.Add方法为panel 面板添加3个Button控件。在添加控件前,需要指定控件相对于父容器的位置,不然的话,控件默认添加到父容器的起始坐标位置上。
然后在窗体类中实现窗体按钮panel的点击事件的响应方法。

        private void panelBt_Click(object sender, EventArgs e)
        {
            PanelExample pE = new PanelExample();
            pE.panel.Size = new Size(panel1.Size.Width,panel1.Size.Height);
            panel1.Controls.Clear();
            panel1.Controls.Add(pE.panel);
        }

此时当我们点击窗体上的窗体上的panel按钮时,窗体上的面板组件panel1就会以添加控件的方式将pE对象中的panel面板容器添加到自身。这样在PanelExample类的构造方法中添加给对象成员panel面板的组件的三个按钮也会显示在窗体上了。

FlowLayoutPanel

流面板容器,可以理解成类似安卓的线性布局,当每往里面添加一个控件时,则此控件将会在前一个控件的后面或者根据其他的排列方式,出现在前面或者上面或下面。

  • 如从左到右排列
 flowLayoutPanel.FlowDirection = FlowDirection.LeftToRight;
Paste_Image.png
  • 从右到左排列
 flowLayoutPanel.FlowDirection = FlowDirection.RightToLeft;
Paste_Image.png
  • 另外分别还有从上到下,从下到上的垂直排列方式。

当一行或一列已经没有足够的空间放下一个控件时,那么这个控件将会自动添加到另一行或另一列的首位置上
如图:

  • 从左到右水平排列


    Paste_Image.png
  • 从上到下垂直排列


    Paste_Image.png
  • FlowLayoutPanelExample类的声明

class FlowLayoutPanelExample
    {
        public FlowLayoutPanel flowLayoutPanel = new FlowLayoutPanel();
        public FlowLayoutPanelExample()
        {
            flowLayoutPanel.Padding = new Padding(20,20,20,20);
            flowLayoutPanel.FlowDirection = FlowDirection.TopDown;
            Button bt = new Button();
            bt.Text = "Button";
           // bt.Location = new System.Drawing.Point(10, 10);
            Button bt_1 = new Button();
            bt_1.Text = "Button1";
           // bt_1.Location = new System.Drawing.Point(bt.Size.Width + 20, 10);
            Button bt_2 = new Button();
            bt_2.Text = "Button2";
            bt_2.Location = new System.Drawing.Point(bt_1.Location.X + bt_1.Size.Width + 20, 100);
         
            Control[] control = new Control[3];
            control[0] = bt;
            control[1] = bt_1;
            control[2] = bt_2;
            flowLayoutPanel.Controls.AddRange(control);
            for (UInt16 i = 0; i < 20; i++)
            {
                Button button = new Button();
                button.Text = "Button" + i;
                flowLayoutPanel.Controls.Add(button);
            }

        }

从代码和实际显示效果看以看出,在流面板组件里指定控件的位置,是无效的。

TableLayoutPane

表格面板容器,可以指定行列来添加控件。
如图所示:

Paste_Image.png

表格面板容器的行列索引从零开始。可以设定所添加控件的所能跨的行列空间大小。例如在计算器应用中,有的按钮所占空间比较大,这时若使用表格面板容器进行摆放,就可以设置此控件的所跨行列控件大小。
例如:

Button bt_6 = new Button();
bt_6.Size = new System.Drawing.Size(bt.Size.Width*2,bt.Size.Height*2); bt_6.Text = "Button6";
 tableLayoutPanel.Controls.Add(bt_6,0,3);
 tableLayoutPanel.SetColumnSpan(bt_6,2);
Paste_Image.png
  • TableLayoutPanelExample类的声明
 class TableLayoutPanelExample
    {
        public TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
        public TableLayoutPanelExample()
        {
            tableLayoutPanel.ColumnCount = 2;
           
            tableLayoutPanel.RowCount = 3;
            Button bt = new Button();
            bt.Text = "Button";
            bt.Location = new System.Drawing.Point(10, 10);
            bt.Click += new EventHandler(Button_Click);
            Button bt_1 = new Button();
            bt_1.Text = "Button1";
            bt_1.Click += new EventHandler(Button_Click);
            bt_1.Location = new System.Drawing.Point(bt.Size.Width + 20, 10);
            Button bt_2 = new Button();
            bt_2.Text = "Button2";
            bt_2.Click += new EventHandler(Button_Click);
          
            bt_2.Location = new System.Drawing.Point(bt_1.Location.X + bt_1.Size.Width + 20, 10);
            tableLayoutPanel.Controls.Add(bt,0,0);
            tableLayoutPanel.Controls.Add(bt_1,1,0);
            tableLayoutPanel.Controls.Add(bt_2, 0, 1);
            Button bt_3 = new Button();
            bt_3.Text = "Button3";
            bt_3.Click += new EventHandler(Button_Click);
            Button bt_4 = new Button();
            bt_4.Text = "Button4";
            bt_4.Click += new EventHandler(Button_Click);
            Button bt_5 = new Button();
            bt_5.Text = "Button5";
            bt_5.Click += new EventHandler(Button_Click);
            tableLayoutPanel.Controls.Add(bt_3, 1, 1);
            tableLayoutPanel.Controls.Add(bt_4, 0, 2);
            tableLayoutPanel.Controls.Add(bt_5, 1, 2);
            Button bt_6 = new Button();
            bt_6.Size = new System.Drawing.Size(bt.Size.Width*2,bt.Size.Height*2);
            bt_6.Text = "Button6";
            tableLayoutPanel.Controls.Add(bt_6,0,3);
            tableLayoutPanel.SetColumnSpan(bt_6,2);
            
        }
        private void Button_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;
            MessageBox.Show("点击的是表格面板中的第" + tableLayoutPanel.GetRow(button) + "行\r第"
                + tableLayoutPanel.GetColumn(button) + "列");
          
        }
    }

关于windows窗体的三类panel的区别和使用方法,由于本人也是因为开发上位机测试应用时,使用到了部分属性和方法来实现某些功能。对于其他未曾使用到的属性和方法,也不是很清晰。如果你对C# 开发窗体应用也有兴趣,或者对文章中某些内容疑惑或者不同的理解及看法。欢迎评论留言,共同探讨学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容