目前是有这样一个需求,要求修改配置文件,我使用的配置文件是ini类型的,通过点击设置按钮弹出一个设置的弹窗,设置弹窗初始化时会读取配置文件的配置,关闭时保存配置到配置文件中,在主窗体文件中会使用最新更新的配置。
刚开始使用的是dispose方式来保存配置:
SettingForm:
protected override void Dispose(bool disposing)
{
if (disposing)
{
SaveConfig();
if (components != null)
components.Dispose();
// 调用基类的 Dispose 方法
base.Dispose(disposing);
}
}
// 窗体初始化
public void InitForm()
{
var parser = new IniParser(AppDomain.CurrentDomain.BaseDirectory + "printconfig.ini");
this.cbxCheckLength.Checked = parser.GetSetting(configRootIni, "enableCheckLength").ToLower().Equals("true") ? true : false;
this.txtBoxLength.IntValue = Convert.ToInt32(parser.GetSetting(configRootIni, "length", "0"));
this.cbxCheckPrefix.Checked = parser.GetSetting(configRootIni, "enableCheckPrefix").ToLower().Equals("true") ? true : false;
this.txtBoxPrefix.Text = parser.GetSetting(configRootIni, "prefix");
}
// 窗体保存
public void SaveConfig()
{
var parser = new IniParser(AppDomain.CurrentDomain.BaseDirectory + "printconfig.ini");
parser.AddSetting(configRootIni, "enableCheckLength", this.cbxCheckLength.Checked.ToString());
parser.AddSetting(configRootIni, "enableCheckPrefix", this.cbxCheckPrefix.Checked.ToString());
parser.AddSetting(configRootIni, "length", this.txtBoxLength.Text);
parser.AddSetting(configRootIni, "prefix", this.txtBoxPrefix.Text);
parser.SaveSettings();
}
主窗体的设置按钮:
private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(new SettingForm("参数设置")); // 非模态方式加载窗体
// 修改配置后,重新加载参数
InitParams();
}
类似这样,似乎在第一次修改时没有生效
查询资料发现:(来自KAMI)
使用 Show 的场景
多任务操作:当您希望用户可以在多个窗体之间自由切换时,使用 Show。
后台处理:当您需要在显示窗体后继续执行其他任务时,使用 Show。
使用 ShowDialog 的场景
用户输入:当您需要用户在继续操作之前完成某些输入或选择时,使用 ShowDialog。
确认操作:当您需要用户确认某些操作(如保存、删除等)时,使用 ShowDialog。
这里的show允许后台处理,类似两个线程同时运行,忽然就知道原因了
既然是同时运行,那么,在我打开窗体,showform之后,紧接着就执行了InitParams,因此,配置没有生效,但实际上,配置文件已经在settingform关闭时,修改完成了,只是读取的数据不对而已
解决方法也很简单,使用showDialogForm,让设置窗体显示为模态窗体即可
完美解决!