编写一个简版的数据库维护框架04-代码实现(基本函数部分1)

文章介绍了如何在VSStudio中遍历控件,特别是通过递归方法查找具有特定属性的控件,如可编辑且带有标记的控件,同时避免包含DataGridView内的控件。此外,还讨论了如何解析控件名称和标签以获取字段名,使用正则表达式从控件的Tag属性中提取信息,如字段名和提示信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先从基本函数入手开始一步一步完善所有代码

一、控件遍历

利用 VS Studio 编程,它会把控件放到父类窗口的一个集合中,可以使用 循环语句将这些控件找出来。

基本方法:

	    public static List<Control> GetCtrls(Control contCtrl)
        {
            List<Control> ctrlList = new List<Control>();
           foreach (Control ctrl in contCtrl.Controls)
            {
                if (ctrl.Controls.Count > 0)
                {
                   	
                    List<Control> subCtrsLst = GetCtrls(ctrl);
                      ctrlList.AddRange(subCtrsLst);
                }
                // label is not the controls we need.
                else
                {
                     ctrlList.Add(ctrl); 
                }
            }
            return ctrlList;
        }

上面是基本的控件遍历语句,上面的控件中使用了递归调用,用来查找容器中的控件。

方法改进

根据我们之前的规定,我们只需要符合我们规定的控件。例如,可编辑控件,并且其名称或者tag中有我们的特殊标记的控件。另外,DataGridView 也是容器控件,里面的控件我们是不需要的。
改进后的函数如下:

      public static List<Control> GetRefreshFieldCtrls(Control contCtrl)
        {
            List<Control> ctrlList = new List<Control>();
            // controls in panel whose tag matched m_SBTblPattern will be ingnored
            if (contCtrl.GetType().Name == "Panel")
            {
                if (ToolKit.GetTableInTag(contCtrl, AppCfg.m_SBTblPattern) != null)

                    return ctrlList;

            }
            foreach (Control ctrl in contCtrl.Controls)
            {

                if (ctrl.Controls.Count > 0)
                {
                    
                    if (ctrl.GetType().Name != "DataGridView")
                    {

                        List<Control> subCtrsLst = GetRefreshFieldCtrls(ctrl);
                        ctrlList.AddRange(subCtrsLst);
                    }
                       
                        
                    
                }
                else if (ctrl.GetType().Name != "Label")
                {

                    if (GetFldFromName(ctrl) != null)
                    {
                        ctrlList.Add(ctrl); 

                    }
                }

            }

            return ctrlList;
        }

这样上面函数中返回的控件就基本人是我们所需要的控件了。

二、字串解析

注意到上面函数中有个 GetFldFromName()函数,这个是自定义函数,其目的是从控件名称中获取字段名称。因此我们需要若干个这样的函数,方便使用。
主要函数如下

GetFldFromName

参数:Control
返回:从名字中获得字段名,如果没有则返回null

// 名字格式举例: txt_fldName
public static string GetFldFromName(Control ctrl)
        {
            var typeName = ctrl.GetType().Name;
            if (typeName == "Label") return null;
            string fld = null;
            int pos;
            pos = ctrl.Name.IndexOf("_");
            if (pos > 0)
            {
                fld = ctrl.Name.Substring(pos + 1);
            }

            return fld;
        }

GetFldFromStr

参数:string
返回:从字符串中中获得字段名,如果没有则返回null

 public static string GetFldFromStr(string str)
        {
           
            string fld = null;
            int pos;
            pos = str.IndexOf("_");
            if (pos > 0)
            {
                fld = str.Substring(pos + 1);
            }

            return fld;
        }

GetFieldInTag

参数:Control 和 正则表达式匹配字串 pattern
功能:返回在Tag中标记的字段名,暂时支持一个字段。

tag中的fild 写法如下:
FL:name

 public static string GetFieldInTag(Control ctrl, string pattern)
        {
           
            string fld = null;
            string tag;
            if (ctrl.Tag == null) return null;
            tag = ctrl.Tag.ToString();
            Match mtch = Regex.Match(tag, pattern);
            if (mtch.Success)
            {
                fld = mtch.Groups["fld"].Value;
            }
            return fld;
        }

GetTableInTag

从Tag中获得表名称
tag写法: TB:table_name

       public static string GetTableInTag(Control ctrl, string tabPattern)
        {
            //<F:field>;
            string table = null;
            string tag;
            if (ctrl.Tag == null) return null;
            tag = ctrl.Tag.ToString();
            
            Match mtch = Regex.Match(tag, tabPattern);
            if (mtch.Success)
            {
                table = mtch.Groups["tab"].Value;
            }
            return table;
        }

说明上面两个函数可以合并为一个。

GetMsgFromCtrlTag

功能: 从tag获得提示信息

private static string GetMsgFromCtrlTag(Control ctrl)
        {
            string tag = ctrl.Tag.ToString();
            Match  match = Regex.Match(tag, AppCfg.m_MsgPattern);
            string info = "";
            if (match.Success)
            {
                info = match.Groups["msg"].ToString();
            }
            return info;
        }

上面几个函数,基本满足了设计中的要求。

注:文章太长了,分成几部分写。

MaraSun BJFEDQ
2023-02-05 祝大家灯笼节快乐!
随附自编灯谜一组,打4个两字词组。

1、月亮高悬十五夜
2、乌蒙磅礴走泥丸
3、重阳高处唤不语
4、盲人磨刀不好玩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值