在WinForm中处理CheckBox控件的最佳实践是什么?

时间:2009-10-25 06:46:55

标签: c# .net winforms

winform:
alt text  

代码:

using System;
using System.Windows.Forms;

namespace DemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            groupBox2.Enabled = checkBox1.Checked;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SaveSetings();
        }

        private void SaveSetings()
        {
            Properties.Settings.Default.UserName = textBox1.Text;
            Properties.Settings.Default.pass = textBox2.Text;
            Properties.Settings.Default.userproxy = checkBox1.Checked;
            Properties.Settings.Default.proxy = textBox3.Text;
            Properties.Settings.Default.proxy_port = textBox4.Text;
            Properties.Settings.Default.Save();
        }

        //private void Form1_Load(object sender, EventArgs e)
        //{
        //    checkBox1.Refresh();
        //    groupBox2.Enabled = checkBox1.Checked;
        //}
    }
}

正如您在代码中看到的那样,我有“使用代理”复选框,选中此选项后应启用groupbox1,反之亦然。问题是当表单从“user.config”加载设置时,即使未选中检查控件,组框1也会启用。处理这种情况的一种方法是检查表单加载事件中的控件,即

groupBox2.Enabled = checkBox1.Checked;

还有其他任何可以做到这一点并使我的应用程序更加动态吗? 我问这个的原因是因为可能存在多个控件在一个表单上的情况,我认为它会变得混乱。

2 个答案:

答案 0 :(得分:2)

与代码示例相比,我通常喜欢做两件事:

  • 不是在控件之间创建耦合依赖关系,而是创建描述状态的值
  • 收集将控件的UI状态(例如VisibleEnabled)更改为单个方法的代码,并在需要时调用它。

示例:

private bool _useProxy;
private bool UseProxy
{
    get
    {
        return _useProxy;
    }
    set
    {
        bool valueChanged = _useProxy != value;
        _useProxy = value;
        if (valueChanged)
        {
            SetControlStates();
        }
    }
}

private void SetControlStates()
{
    groupBox2.Enabled = this.UseProxy;
    checkBox1.Checked = this.UseProxy;
}

private void checkBox1_CheckedChanged(object sender, EventArgs 
    this.UseProxy = checkBox1.Checked;
}

然后,在Form_Load中,从配置文件中读取时,只需为文件中的值指定this.UseProxy即可。这样,不同的控件不会以相同的方式彼此依赖,而是依赖于它们相关的状态。

答案 1 :(得分:0)

Form.Loaded处理程序集中的

setBox2.Enabled = Properties.Settings.Default.userproxy;