有时候,设计的程序有很多的控件,甚至多达近百个,尤其是一些工控软件等,程序运行所需的各种参数都是由用户通过这些控件设置而来,那么记录用户的设置就显得十分必要。如果程序出现异常,起码重新打开可以不用再一个一个的去设置。在调试的过程中也方便了很多。
而很多人的代码是类似这样:
config.write("id",txtID.text) ;
config.write("pw",txtPW.text) ;
... ...
一个一个的输入,这样显得非常繁琐,下面提供了VB和C#两种方法来简化这一过程
Private Sub SaveConfig(frm As Form)
    Dim objX As Object
    For Each objX In frm.Controls
        If TypeOf objX Is TextBox Then
            Config.cWrite objX.Name, objX.Text
        ElseIf TypeOf objX Is CheckBox Then
            Config.cWrite objX.Name, objX.Value
        End If
    Next
End Sub

Private Sub ReadConfig(frm As Form)
    Dim objX As Object
    Dim s As String
    For Each objX In frm.Controls
        If TypeOf objX Is TextBox Then
            s = Config.cRead(objX.Name)
            If Len(s) > 0 Then objX.Text = s
        ElseIf TypeOf objX Is CheckBox Then
            s = Config.cRead(objX.Name)
            If Len(s) > 0 Then objX.Value = CLng(s)
        End If
    Next
End Sub
如果用上面的函数就显得非常方便了,即使以后添加了控件也不需要另外写代码
其中Config对象是一个封装的操作配置文件(*.ini)的类,由于这个类不在本篇讨论范围,所以不贴了,反正也简单,百度一下
如果只想针对某个frame或picturebox容器内控件,那么可以用对象的Container属性
If objX.Container Is Picture1 Then
... ...'这样就可以筛选出在Picture1下的所有控件
end if
当程序启动的时候,先读取配置到控件
当用户确定设置的时候,就记录一下,很简单方便
===============================================================================
===============================================================================
C#中也可以这么写:
//把相应控件的值写入到config.ini配置文件中
void ReadConfig(Control item)
{
    foreach (Control ctl in item.Controls)
    {
        string s = ctl.GetType().ToString();
        string[] sp = s.Split('.');
        switch (sp[sp.Length - 1])
        {
            case "TextBox":
                TextBox tb = ctl as TextBox;
                tb.Text = INI.IniReadValue("配置", ctl.Name);
                break;
            case "RadioButton":
                if (INI.IniReadValue("配置", ctl.Name) == "True")
                {
                    RadioButton rb = ctl as RadioButton;
                    rb.Checked = true;
                }
                break;
            case "ComboBox":
                ComboBox cb = ctl as ComboBox;
                if (cb.Items.Count > 0)
                {
                    s = INI.IniReadValue("配置", ctl.Name);
                    if (IsNumber(s) == true)
                    {
                        int i = Convert.ToInt32(s);
                        if ( i>= 0 && i < cb.Items.Count)
                            cb.SelectedIndex = i;
                    }
                }
                break;
            case "ListBox":
                ListBox lst= ctl as ListBox;
                if (lst.Items.Count > 0)
                {
                    s = INI.IniReadValue("配置", ctl.Name);
                    if (IsNumber(s) == true)
                    {
                        int i = Convert.ToInt32(s);
                        if (i >= 0 && i < lst.Items.Count)
                            lst.SelectedIndex = i;
                    }
                }
                break;
            case "CheckBox":
                CheckBox ck = ctl as CheckBox;
                if (INI.IniReadValue("配置", ctl.Name) == "True")
                    ck.Checked = true;
                else
                    ck.Checked = false;
                break;
        }
        if (ctl.HasChildren) //如果控件有子控件,就递归
            ReadConfig(ctl);
    }
}
//把相应控件的值写入到config.ini配置文件中
void SaveConfig(Control item)
{
    foreach (Control ctl in item.Controls)
    {
        string s = ctl.GetType().ToString();
        string[] sp = s.Split('.');
        switch (sp[sp.Length - 1])
        {
            case "TextBox":
                TextBox tb = ctl as TextBox;
                if(tb.Multiline==false ) //不是多行文本框就写入
                    INI.IniWriteValue("配置", ctl.Name, tb.Text);
                break;
            case "RadioButton":
                RadioButton rb = ctl as RadioButton;
                INI.IniWriteValue("配置", ctl.Name, rb.Checked.ToString ());
                break;
            case "ComboBox":
                ComboBox cb = ctl as ComboBox;
                if (cb.Items.Count > 0)
                    INI.IniWriteValue("配置", ctl.Name, cb.SelectedIndex.ToString());
                break;
            case "ListBox":
                ListBox lst = ctl as ListBox;
                if (lst.Items.Count > 0)
                    INI.IniWriteValue("配置", ctl.Name, lst.SelectedIndex.ToString());
                break;
            case "CheckBox":
                CheckBox ck = ctl as CheckBox;
                INI.IniWriteValue("配置", ctl.Name, ck.Checked.ToString ());
                break;
        }
        if (ctl.HasChildren) //如果控件有子控件,就递归
            SaveConfig(ctl);
    }
}
其中INI是封装的操作配置文件(*.ini)的类,如果只想要操作某一个frame、picture或tabControl容器内的所有控件,传值该控件对象即可。

记忆用户设置-提升程序的体验VB/C#的更多相关文章

  1. iOS 用RunTime来提升按钮的体验

    用RunTime来提升按钮的体验 载请标明出处:http://blog.csdn.net/sk719887916/article/details/52597388,作者:Ryan 经常处理按钮问题都是 ...

  2. 用户选择wordpress程序建站需要知道的一些事情 - 安全、优化速度、配置

    WordPress是我们使用最多的CMS程序之一,无论是我们的个人博客,还是企业网站,甚至中小型站点,我们都可以用WP程序部署.我们看到海外网站的时候,大部分都是用的WORDPRESS程序.在我们国人 ...

  3. 如何结合整洁架构和MVP模式提升前端开发体验(二) - 代码实现篇

    上一篇文章介绍了整体架构,接下来说说怎么按照上图的分层结构实现下面的增删改查的功能. 代码结构 vue userManage └── List ├── api.ts ├── EditModal │ ├ ...

  4. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  5. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  6. Windows Phone 8初学者开发—第6部分:设置应用程序的样式

    原文 Windows Phone 8初学者开发—第6部分:设置应用程序的样式 Source Code: http://aka.ms/absbeginnerdevwp8  PDF Version: ht ...

  7. SharePoint 2016 配置用户请求应用程序

    最近看了看SharePoint的应用程序,觉得还是不错的,以前都没怎么注意过这样的功能.当然,应用程序除了让用户和管理员添加外,还可以让他们进行请求,把应用程序添加到应用程序目录,然后由统一的管理员进 ...

  8. 微信小程序初体验,入门练手项目--通讯录,部署上线(二)

    接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...

  9. 【转载】Win10系统如何设置所有程序默认以管理员身份运行?

    在win10系统中有些用户发现一些程序只有使用管理员身份运行能才打开,这样的话就感觉会麻烦很多,那么有没有办法设置所有程序都默认以管理员身份运行,而无需我们一个一个右键点击再打开呢? 目前最好的方法就 ...

随机推荐

  1. Android ANR分析(三)

    http://www.jianshu.com/p/8964812972be http://stackoverflow.com/questions/704311/android-how-do-i-inv ...

  2. GMap.Net开发之地址解析与路径查找

    上一篇介绍了如何在GMap地图上添加多边形,这篇介绍下如何使用在线的地图服务进行“地址解析”和“路径查找”. 先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法: ...

  3. 攻城狮在路上(肆)How tomcat works(二) 一个简单的servlet容器

    该节在上一节的基础上增加了所谓对静态资源和动态资源访问的不同控制流程.示例里面采用的是对路径“/servlet/”进行了特殊处理. 一. 主要还是从HttpServer1中的main方法开始,先解析出 ...

  4. [荐]SWFObject 2最新版语法调用示例

    我一直都在用SWFObject 插入flash,好处多多,代码简洁,不会出现微软的“单击此处以激活控件”的提示(据可靠消息,这个是微软惹的官司,其结果是害苦了用户).不过先前的 调用方法着实有些繁琐, ...

  5. url地址中 "&" "/"等符号的转义处理(转)

    URL出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好? 解决办法:将这些字符转化成服务器可以识别的字符,对应关系如下: URL中的特殊字 ...

  6. WebStorm中将Project分享到GitHub时报“Error Running Git”错误的解决办法

    错误信息 Cannot run program "git.exe":CreateProcess error=2,系统找不到指定的文件. 解决办法 从错误信息就可以知道,WebSto ...

  7. Linux学习笔记(13)权限管理

    1 ACL权限 (1)简介和开启方式 ACL(Access Control List)权限的目的是在提供传统的owner.group.others的read.write.execute权限之外的局部权 ...

  8. CDN网络的原理

    来源:http://blog.csdn.net/coolmeme/article/details/9468743 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.用户向浏览器输入www.we ...

  9. 分享Kali Linux 2016.2第43周镜像

    分享Kali Linux 2016.2第43周镜像Kali Linux官方于10月23日如约发布了2016.2第43周镜像.和以往一样,此次镜像包含了11个镜像文件,包含PC端的32和64位镜像,还有 ...

  10. CSS的clip-path

    在Web网页中主要是以矩形分布的.而平面媒体则倾向于更多不同的形状.造成这种差异的原因是因为缺少合适的工具去实现我们平面媒体中的内容.这也就造成了很多设计师的创意发挥,就算是有创意,前端实现也将付出巨 ...