【发布时间】:2017-07-06 01:40:10
【问题描述】:
我是 c# 的新手,并且有点喜欢它。使用 Microsoft Visual C# 2010
我查看了许多类似的帖子,但似乎没有任何建议有帮助
我收到以下错误:“无法访问已处置的对象” 这里引用了主窗体
private void btn_RunPkgs_Click(object sender, EventArgs e)
{
RunPackages rp = new RunPackages();
this.Hide();
rp.ShowDialog();//The error points to this line
this.Show();
}
这里是安全检查失败时崩溃的代码。
private void securityCheck()
{
if (MyGlobals.FormCheck("RUN_JOBS") == 1)
{
InitializeComponent();
}
else
{
//this.BeginInvoke(new MethodInvoker(this.Close));
//this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
MessageBox.Show("You do not have permission to access this form!");
//this.Close();
this.Dispose();
}
}
编辑 看起来我会接受 Adriano Repetti 的想法,即把安全性放在我称之为页面的地方,但我现在有点紧张,因为页面上有任何安全性。
private void btn_RunPkgs_Click(object sender, EventArgs e)
{
if (MyGlobals.FormCheck("RUN_JOBS") == 1)
{
RunPackages rp = new RunPackages();
this.Hide();
rp.ShowDialog();
this.Show();
}
else
{
MessageBox.Show("Not for You!");
}
}
private void btn_ListUpdater_Click(object sender, EventArgs e)
{
if (MyGlobals.FormCheck("MDM") == 1)
{
ListUpdater lu = new ListUpdater();
this.Hide();
lu.ShowDialog();
this.Show();
}
else
{
MessageBox.Show("Private!");
}
}
EDIT2 想出了以下可能的解决方案,但使用它时很紧张,因为我是新手,不知道可能存在什么问题。为表单加载创建事件处理程序有什么问题吗?
namespace RunPackages
{
public partial class ListUpdater : Form
{
public ListUpdater()
{
InitializeComponent();
this.Load += new EventHandler(securityCheck);
}
private void securityCheck(object sender, EventArgs e)
{
if (MyGlobals.FormCheck("MDM1") == 0)
{
MessageBox.Show("Not Allowed!");
this.Close();
}
}
【问题讨论】:
-
this.Dispose()你想处理什么?你为什么这么叫? -
我写了一个安全检查,如果用户在该特定表单上失败,我希望它显示一个错误消息框并关闭该表单,返回主表单。我第一次尝试这个。关闭
-
那是因为您在
ShowDialog期间是表单的Disposing,因为在此之后它无法引用自己,所以猜测您没有向我们展示更多代码。跨度> -
一般来说,在进行最基本的编码时,不需要直接处理对象。把这种事情留给垃圾收集器。为什么
this.Close()被注释掉了?似乎这应该足以满足您的需求。 -
对每个表单进行安全检查(不同的表单有不同的权限) MyGlobals.Formcheck("FormName") 检查用户和表单的权限。如果权限很好,它会很好地工作,当用户检查失败时它会关闭表单,这是一个问题。