现在的位置: 首页 > 综合 > 正文

关于Excel操作编写的一个软件设计构思案例[连载] –如何创建快捷菜单执行人机交互操作、软件初始化设置

2013年03月04日 ⁄ 综合 ⁄ 共 4194字 ⁄ 字号 评论关闭

创建快捷菜单现在对我来说轻车熟路,轻而易举,代码如下:

        private void Form1_Load(object sender, EventArgs e)
        {
            加载空结果(); 加载树图标集();
            System.Action<string[]> 带参无回传方法2 = (列名) => { 创建数据显示(列名, 条件设定); }; 带参无回传方法2.Invoke(创建2);
            条件设定.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            处理提示.Text = "友情提示:操作顺序:1、提取(所有地址),2、替换(错字和不全文字),3、补缺(地址和户名);规则:字数多优先提取;原则:各列自上而下。";
            string[] 主体快捷参数 = new string[]
            {
                "[金刚般若]|0", "-|",
                "浏览Excel文件|8","保存Excel文件|8", 
                "-|", 
                "数据导入|1", "提取数据|1", "数据导出|1",
                "-|",
                "导入设定|2", "重载设定|2", "保存设定|2", "导出设定|2", 
                "-|",
                "全列替换|4", "定列替换|4", "定位替换|4",
                "-|",
                "补缺地址|7", "补缺户名|7", "标准地址|7",
                "-|",
                "查找字符|5", "地址树形加载|6", "地址树形展开|6", "地址树形折叠|6",
                "-|", "退出(&X)|3"
            };/**/
            EventHandler[] 主体快捷事件 = new EventHandler[] 
            { null, null,
                (悟, 空) => 浏览Excel文件(),
                (悟, 空) => 保存Excel文件(),
                null,
                (悟, 空) => 数据导入(),
                (悟, 空) => 提取数据自动处理(读取表格数据.Tables[0].Rows.Count),
                (悟, 空) => 数据导出Excel文件(处理结果, 创建1),
                null,
                (悟, 空) => 导入设定(),
                (悟, 空) => 读取设定("条件设定.xls", true),
                (悟, 空) => 条件设定生成表("条件设定.xls", true),
                (悟, 空) => 数据导出Excel文件(条件设定, 创建2),
                null,
                (悟, 空) => 替换字符("全列"),
                (悟, 空) => 替换字符("定列"),
                (悟, 空) => 替换字符("定位"),
                null,
                (悟, 空) => 补缺地址(""),
                (悟, 空) => 补缺户名(),
                (悟, 空) => 读文本("标准地址", ""),
                null,
                (悟, 空) => 查找字符(),
                (悟, 空) => 地址树(),
                (悟, 空) => {地址分类树.ExpandAll();if (树定位.Text != "")地址分类树.SelectedNode = 树定位;},
                (悟, 空) => 地址分类树.CollapseAll(),
                null, (悟, 空) => this.Close()
            };
            this.BeginInvoke(new System.Action<ContextMenuStrip, string[], EventHandler[], string[]>((菜单名, 参数, 事件, 背景图) => 快捷菜单(菜单名, 参数, 事件, 背景图)), 主体快捷菜单, 主体快捷参数, 主体快捷事件, null);
            this.BeginInvoke(new System.Action(delegate()
            {
                 this.ContextMenuStrip = 主体快捷菜单;
                 菜单设置(new int[] { 3, 6, 7, 14, 15, 16, 18, 19, 20, 21, 22, 23 }, false);
            }));
            主体快捷菜单.BackgroundImage = System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\2012年08月19日 星期日 27217.BMP");
            读取设定("条件设定副本.xls", false); 读取设定("条件设定.xls", true);
        }

本来刚写这个软件时,每个方法都是空参数的,随着功能增加,为了重用代码,有些方法逐步加了参数,参数个数也随之增加,写代码已形成习惯,就是喜欢写独立的方法,这样可以在其他软件中直接复制过去,直接使用或是稍加修改使用,充分提高代码利用率,这个是这次软件能快速开发投入使用得益之处。如下代码之前发布过:

        private void 快捷菜单(ContextMenuStrip 菜单名, string[] 参数, EventHandler[] 事件, string[] 背景图)
        {
            计数 = 0; string[] 列表 = null;
            foreach (string 元素 in 参数)
            {
                if (元素 != null) 列表 = 元素.Split('|');
                if (列表[0].Length > 0) 菜单名.Items.Add(列表[0]);
                if (列表[1].Length > 0) 菜单名.Items[计数].Image = 图标集.Images[int.Parse(列表[1])];/*XP系统无法加载需注释掉这句单独生成*/
                if (事件 != null && 事件[计数] != null) 菜单名.Items[计数].Click += new EventHandler(事件[计数]);
                计数++;
            }
            //菜单名.Items[0].BackColor = System.Drawing.Color.Beige; 菜单名.Items[13].BackColor = System.Drawing.Color.Gold;
            if (背景图 != null)
                foreach (string 元素 in 背景图)
                {
                    if (元素 != null || 元素 != "") 列表 = 元素.Split('|');
                    菜单名.Items[int.Parse(列表[0])].BackgroundImage = System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + 列表[1]);
                }
        }

菜单可否操作属性设置代码:

        private void 菜单设置(int[] 序, bool 选项)
        { foreach (int 元素 in 序) 主体快捷菜单.Items[元素].Enabled = 选项; }

打开一个软件如果什么都没让人看到,那使用的人就会提问了,呵呵,所以,要给软件执行一些初始化操作,一打开软件,目光所见一目了然,所见即所得。
设置3个控件初始化,对左边树控件随意赋值,让人看到这是一棵树就行,所以,加载开篇中写的多维数组神树;上下2个数据显示控件分别显示标题,代码如下:

        private void 创建数据显示(string[] 表名, DataGridView 控件名)
        {
            控件名.Columns.Clear();
            foreach (string 元素 in 表名)
            {
                DataGridViewTextBoxColumn 列 = new DataGridViewTextBoxColumn();
                列.HeaderText = 元素; 列.DataPropertyName = 元素;
                列.MaxInputLength = 3988; 控件名.Columns.Add(列);
            }
        }

        private void 加载空结果()
        {
            System.Action<string[]> 带参无回传方法 = (列名) => { 创建数据显示(列名, 处理结果); };
            带参无回传方法.Invoke(创建1); 处理结果.AllowUserToAddRows = false;
        }
        private void 加载树图标集()
        {
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\icolicious.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\Illustrator 10.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\狮子.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\阴阳图.jpg"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\五星红旗.png"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\查找.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\Directory Tree.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\torrentprogram.ico"));
            图标集.Images.Add(System.Drawing.Image.FromFile(@System.Environment.CurrentDirectory + "\\图标集\\excel.ico"));
            主体快捷菜单.ImageList = 图标集;
        }

这样,软件就可以操作执行处理了,处理后的结果怎么弄出来呢,下次发布:如何把处理好后的数据导出Excel文件中。

抱歉!评论已关闭.