C# WinForm打开设置Form2展示已保存配置,附完整代码求问题排查
代码核心问题与修正方案
核心错误点
- 混淆了单选按钮
Checked(选中状态)和Text(显示文本)属性:当前代码存储的是单选按钮的显示文本,而非开关状态,无法正确记录配置 - 加载逻辑顺序错误:
Setting_Load中先调用DefaulSetting()把配置覆盖为初始值,再读取配置,等于每次打开设置窗都会重置配置 - 方法逻辑混乱:
GetDefaulSetting()同时承担读取配置、写入配置、持久化保存三个冲突逻辑,功能完全错位 - 事件逻辑冗余:每组两个单选按钮不需要分别绑定
CheckedChanged事件,单个事件即可处理互斥逻辑 - 取消按钮逻辑错误:点击取消应当还原为打开窗口时的原有配置,而非直接将所有选项设为启用
修正步骤
1. 调整Settings配置类型
打开项目的Settings1.settings,将所有配置项的类型从string改为bool,默认值设为True即可:
- SerialRead
- SerialWrite
- SerialChart
- DataTable
- Report
2. 替换Setting窗体的所有代码
// 新增私有字段存储打开窗口时的原始配置,用于取消操作回滚 private bool _originalSerialRead; private bool _originalSerialWrite; private bool _originalSerialChart; private bool _originalDataTable; private bool _originalReport; private void Setting_Load(object sender, EventArgs e) { // 先暂停事件触发,避免赋值时触发CheckedChanged修改Form1状态 PauseCheckedChangedEvents(false); // 加载存储的配置到控件 LoadSetting(); // 备份原始配置用于取消回滚 BackupOriginalSetting(); // 恢复事件触发 PauseCheckedChangedEvents(true); // 同步Form1当前状态 SyncForm1Status(); } // 加载配置到单选按钮 private void LoadSetting() { EnableSerialRead.Checked = Settings1.Default.SerialRead; DisableSerialRead.Checked = !Settings1.Default.SerialRead; EnableSerialWrite.Checked = Settings1.Default.SerialWrite; DisableSerialWrite.Checked = !Settings1.Default.SerialWrite; EnableSerialChart.Checked = Settings1.Default.SerialChart; DisableSerialChart.Checked = !Settings1.Default.SerialChart; EnableDataTable.Checked = Settings1.Default.DataTable; DisableDataTable.Checked = !Settings1.Default.DataTable; ReportEnable.Checked = Settings1.Default.Report; ReportDisable.Checked = !Settings1.Default.Report; } // 备份原始配置 private void BackupOriginalSetting() { _originalSerialRead = EnableSerialRead.Checked; _originalSerialWrite = EnableSerialWrite.Checked; _originalSerialChart = EnableSerialChart.Checked; _originalDataTable = EnableDataTable.Checked; _originalReport = ReportEnable.Checked; } // 暂停/恢复所有单选按钮的CheckedChanged事件 private void PauseCheckedChangedEvents(bool isSubscribe) { if (isSubscribe) { EnableSerialRead.CheckedChanged += SerialRead_CheckedChanged; EnableSerialWrite.CheckedChanged += SerialWrite_CheckedChanged; EnableSerialChart.CheckedChanged += SerialChart_CheckedChanged; EnableDataTable.CheckedChanged += DataTable_CheckedChanged; ReportEnable.CheckedChanged += Report_CheckedChanged; } else { EnableSerialRead.CheckedChanged -= SerialRead_CheckedChanged; EnableSerialWrite.CheckedChanged -= SerialWrite_CheckedChanged; EnableSerialChart.CheckedChanged -= SerialChart_CheckedChanged; EnableDataTable.CheckedChanged -= DataTable_CheckedChanged; ReportEnable.CheckedChanged -= Report_CheckedChanged; } } // 同步Form1的控件状态 private void SyncForm1Status() { var form1 = this.Owner as Form1; form1.tabControl1.TabPages[0].Enabled = EnableSerialRead.Checked; form1.tabControl1.TabPages[1].Enabled = EnableSerialWrite.Checked; form1.tabControl1.TabPages[2].Enabled = EnableSerialChart.Checked; form1.chart1.Visible = EnableSerialChart.Checked; form1.tabControl1.TabPages[3].Enabled = EnableDataTable.Checked; form1.tabControl1.TabPages[4].Enabled = ReportEnable.Checked; } // 每组单选按钮只需要一个事件处理 private void SerialRead_CheckedChanged(object sender, EventArgs e) { (this.Owner as Form1).tabControl1.TabPages[0].Enabled = EnableSerialRead.Checked; } private void SerialWrite_CheckedChanged(object sender, EventArgs e) { (this.Owner as Form1).tabControl1.TabPages[1].Enabled = EnableSerialWrite.Checked; } private void SerialChart_CheckedChanged(object sender, EventArgs e) { var form1 = this.Owner as Form1; form1.tabControl1.TabPages[2].Enabled = EnableSerialChart.Checked; form1.chart1.Visible = EnableSerialChart.Checked; } private void DataTable_CheckedChanged(object sender, EventArgs e) { (this.Owner as Form1).tabControl1.TabPages[3].Enabled = EnableDataTable.Checked; } private void Report_CheckedChanged(object sender, EventArgs e) { (this.Owner as Form1).tabControl1.TabPages[4].Enabled = ReportEnable.Checked; } // 保存按钮逻辑 private void btnSave_Click(object sender, EventArgs e) { // 把控件状态写入配置 Settings1.Default.SerialRead = EnableSerialRead.Checked; Settings1.Default.SerialWrite = EnableSerialWrite.Checked; Settings1.Default.SerialChart = EnableSerialChart.Checked; Settings1.Default.DataTable = EnableDataTable.Checked; Settings1.Default.Report = ReportEnable.Checked; // 持久化保存 Settings1.Default.Save(); MessageBox.Show("Setting save successfully"); this.Close(); } // 取消按钮逻辑 private void btnCancel_Click(object sender, EventArgs e) { // 暂停事件避免回滚时触发状态修改 PauseCheckedChangedEvents(false); // 还原到打开窗口时的原始配置 EnableSerialRead.Checked = _originalSerialRead; DisableSerialRead.Checked = !_originalSerialRead; EnableSerialWrite.Checked = _originalSerialWrite; DisableSerialWrite.Checked = !_originalSerialWrite; EnableSerialChart.Checked = _originalSerialChart; DisableSerialChart.Checked = !_originalSerialChart; EnableDataTable.Checked = _originalDataTable; DisableDataTable.Checked = !_originalDataTable; ReportEnable.Checked = _originalReport; ReportDisable.Checked = !_originalReport; // 恢复事件 PauseCheckedChangedEvents(true); // 同步Form1状态回滚 SyncForm1Status(); this.Close(); } private void btnClose_Click(object sender, EventArgs e) { this.Close(); }
3. 后续操作
先在设计器里删除原来所有单选按钮绑定的旧CheckedChanged事件,然后重新绑定上面新增的对应分组事件即可,无需修改Form1的设置按钮打开逻辑。
内容的提问来源于stack exchange,提问作者Pio
相关产品推荐
相关产品推荐

