2

在加载表单时,我需要进行X大量检查以确定是否打开或关闭表单。下面是一个简单的例子。

public partial class BaseForm : Form
{
  private void BaseForm_Load(object sender, EventArgs e)
  {
    if(!IsUserValid())
      MessageBox.Show("User is not valid");
  }
  private bool IsUserValid()
  {
    List<string> allowedUsernames = new List<string>();
    using (SqlConnection con = new SqlConnection(_connectionString))
    {
      //Get a list of usernames, none of which are "Developer" usernames
    }
    return allowedUsernames.Any(username => username == Environment.UserName);
  }
}
public partial class DerivedForm : BaseForm
{

}

上面的示例,无论我的用户名如何,我都可以在设计器中完美加载表单。如果我做另一个表单,DerivedForm并继承基,那么它会调用Load,因此将显示一个MessageBox,然后Close在设计模式下显示一个表单,它不允许我访问设计器,为什么派生WindowsForm需要使用Load事件但基不需要? 如果您正在使用继承进行继承,WindowsForms那么不使用 Load 事件是否明智?

我只是觉得这很奇怪,有人知道吗?

4

1 回答 1

1

还有另一个问题解决了类似的问题。此外,接受的答案提供了克服这种行为的解决方案:https ://stackoverflow.com/a/2427420/674700 。

基本上,在您的情况下,添加DesignTimeHelper类并使用以下修改来查看差异:

private void BaseForm_Load(object sender, EventArgs e)
{
    if (!DesignTimeHelper.IsInDesignMode)
    {
        if (!IsUserValid())
        {
            MessageBox.Show("User is not valid");
        }
    }
    else
    {
        MessageBox.Show("Called from VS");
    }
}
于 2013-02-13T15:32:01.270 回答