c# 动态生成控件

c# 动态生成控件今天这个主题主要也是群里小伙伴提到的一个问题,就是如何动态的生成控件,他是想自动生成一级二级菜单这样,我这里主要是动态生成的picturebox,希望能给他起到借鉴的作用,然后举一反三…

大家好,欢迎来到IT知识分享网。

  今天这个主题主要也是群里小伙伴提到的一个问题,就是如何动态的生成控件,他是想自动生成一级二级菜单这样,我这里主要是动态生成的picturebox,希望能给他起到借鉴的作用,然后举一反三完成自己的项目!

      以下代码是从好几年前的一个项目中抠出来的,然后做了一些小的改动,以动态生成控件展示图片为核心!

      接下来介绍下项目:控件:richTextBox1,richTextBox2 代表生产的图片框的行数和列数,可以自定义,button1名字是ACTION ,点击后自动生成图片框并加载图片,生成的picture位于panel1中,每次双击pictrue,会放大图片显示到右边的图片框!

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;


namespace 动态生成控件
{
    public partial class Form1 : Form
    {
        public Form1()
{
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
{
            panel1.AutoScroll = true;//让panel显示滚动条           
        }
        public  string ImagePath = Application.StartupPath +"\\image\\";
        string[,] ImageFromPath = new string[300, 300];
        int Row = 3, Cloumn = 3;
        public string AmpImagePath = string.Empty;
        /// <summary>
        /// 自动生成图片控件并加载图片,同时给图片控件添加双击事件
        /// </summary>
        /// <param name="row">生成图片控件的行数</param>
        /// <param name="cloumn">生成图片控件的列数</param>
        public void PictureControl(int row, int cloumn)
{
            try
            {
               int ImageBoxCount = 0;
               panel1.Controls.Clear();
               for (int i = 0; i < row; i++)
                    for (int j = 0; j < cloumn; j++)
                    {
                        PictureBox p = new PictureBox();
                        p.Name = ImageBoxCount.ToString();
                        p.Size = new System.Drawing.Size(108, 216);//长宽比例是1.25:1
                        p.Top = i * 226;
                        p.Left = j * 118;
                        p.MouseDoubleClick += M;//鼠标双击事件
                        ImageBoxCount++;
                        p.BackColor = Color.Gray;
                        p.SizeMode = PictureBoxSizeMode.Zoom;
                        p.BorderStyle = BorderStyle.FixedSingle;
                        if (IsFileInUse(ImageFromPath[i, j]) == false)
                        {                           
                            Stream s = File.Open(ImageFromPath[i, j], FileMode.Open);
                            p.Image = Image.FromStream(s);
                            s.Close();
                            s.Dispose();
                        }
                        else
                        {
                            //p.Image = Image.FromFile(ImageFromPath[i, j]);
                        }
                        p.BackColor = Color.Gray;
                        this.panel1.Controls.Add(p);
                    }
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
        private void M(object sender, EventArgs e)
{
            try
            {
                PictureBox p = sender as PictureBox;
                AmpImagePath = ImageFromPath[Convert.ToInt32(p.Name) / Cloumn,Convert.ToInt32(p.Name) % Cloumn];
                Stream s = File.Open(AmpImagePath, FileMode.Open);
                pictureBox1.Image = Image.FromStream(s);
                s.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }


        }
        private void button1_Click(object sender, EventArgs e)
{
            Row = int.Parse(richTextBox1.Text);
            Cloumn = int.Parse(richTextBox2.Text);
            for (int i = 0; i < Row; i++)
                for (int j = 0; j < Cloumn; j++)
                {
                    ImageFromPath[i, j] = ImagePath + (i * Cloumn + j + 1).ToString() + ".jpg"; //保存每张图的路径
                    //Console.WriteLine(ImagePath + (i * 3 + j + 1).ToString() + ".jpg");
                }
            PictureControl(Row, Cloumn);
        }


        public static bool IsFileInUse(string fileName)
{
            bool inUse = true;
            FileStream fs = null;
            try
            {
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
                inUse = false;
            }
            catch
            {
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
            return inUse;//true表示正在使用,false没有使用
        }




    }
}

29d69264921c26a077eae57088ad02f4.png

github代码地址:

https://github.com/zyr365/Dynamically-build-control需要的朋友可以上去下载源码,都是我测试通过的!

学习心得:代码这东西一定记得勤动手实践,不要光看,以免眼高手低,项目也不是做的越多越好,你可以把一个项目做的很细很完美,不断添加各种功能模块上去也是很不错的学方法!

———————————————————-

如果觉得有用,麻烦点击 在看,让更多志同道合的伙伴加入我们的交流群,一起共同进步!

大家有什么想了解的主题或者其它疑惑可以在评论群下方留言,如果想了解的人多而且我懂得话随后我会以主题的形式分享给大家!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14519.html

(0)
上一篇 2024-02-25 18:45
下一篇 2024-02-29 08:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信