先从基本函数入手开始一步一步完善所有代码
一、控件遍历
利用 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、盲人磨刀不好玩