仿照BDN社区的MSCE addins教程写了一个窗体,想要实现的功能是:
关闭窗体时,将文本框中的数据存入注册表,下次打开窗体时再从注册表中将数据读到文本框内,如果注册表中没有数据,则从文本框的tag中读取数据。代码如下:
private void _Form_TunnelLightingCalculation_FormClosed(object sender, FormClosedEventArgs e) { RegistryKey rootKey = Registry.CurrentUser.OpenSubKey("Software", true); RegistryKey appKey = rootKey.CreateSubKey("RoadElect"); RegistryKey myKey = appKey.CreateSubKey("TunnelLightingCalculation"); myKey.SetValue("text_W", text_W.Text.ToString()); myKey.SetValue("text_L", text_L.Text.ToString()); myKey.SetValue("text_N", text_N.Text.ToString()); myKey.SetValue("text_pavement", text_pavement.Text.ToString()); myKey.SetValue("text_h", text_h.Text.ToString()); myKey.SetValue("text_Vt", text_Vt.Text.ToString()); myKey.SetValue("text_Characteristic", text_Characteristic.Text.ToString()); myKey.SetValue("check_mix", check_mix.Checked.ToString()); myKey.SetValue("check_opposite", check_opposite.Checked.ToString()); myKey.SetValue("check_optics", check_optics.Checked.ToString()); } private void _Form_TunnelLightingCalculation_Load(object sender, EventArgs e) { RegistryKey myKey = Registry.CurrentUser.OpenSubKey("Software\\RoadElect\\TunnelLightingCalculation"); if (null != myKey) { text_W.Text = myKey.GetValue("text_W").ToString(); text_L.Text = myKey.GetValue("text_L").ToString(); text_N.Text = myKey.GetValue("text_N").ToString(); text_pavement.Text = myKey.GetValue("text_pavement").ToString(); text_h.Text = myKey.GetValue("text_h").ToString(); text_Vt.Text= myKey.GetValue("text_Vt").ToString(); text_Characteristic.Text = myKey.GetValue("text_Characteristic").ToString(); check_mix.Checked = Boolean.Parse(myKey.GetValue("check_mix").ToString()); check_opposite.Checked = Boolean.Parse(myKey.GetValue("check_opposite").ToString()); check_optics.Checked= Boolean.Parse(myKey.GetValue("check_optics").ToString()); } else { text_W.Text = text_W.Tag.ToString(); text_L.Text = text_L.Tag.ToString(); text_N.Text = text_N.Tag.ToString(); text_pavement.Text = text_pavement.Tag.ToString(); text_h.Text = text_h.Tag.ToString(); text_Vt.Text = text_Vt.Tag.ToString(); text_Characteristic.Text = text_Characteristic.Tag.ToString(); } }
但运行的时候,每次都只能从tag内获取数据,并不会读取注册表中的,查看注册表发现Software\\RoadElect\\TunnelLightingCalculation这个注册表根本就没有创建出来。想请教下是哪里出了问题?
猜测可能是注册表需要管理员权限才能写入,您可以弄一个单独的Winform程序试试看能不能写 成功。另外不建议在注册表里边保存这些数据,可以在环境变量Temp指定的路径下保存这些数据。
我试了您在addin教程里提供的案例,是可以成功写入注册表的。另外我刚刚测试了下,发现窗体关闭时,_Form_TunnelLightingCalculation_FormClosed这个事件根本没有被触发,但是VS环境中标注显示这个事件有一个引用,程序中目前也只有这一个窗体,这种情况应该如何处理?
您的问题看起来像是最基本的C#编程问题,与Bentley开发关系不大。请找一本C#编程书籍系统地学习一下C#的WinForm开发。
问题解决了,我之前装载窗体时用的是AttachAsGuiDockable,改用AttachAsTopLevelForm后就可以成功触发窗体关闭事件了。
Answer Verified By: Yongan.Fu
不过还是没理解为什么这两个attach方法会有如此区别,文档中也找不到详细说明。