【问题标题】:How can i make 2 forms in seperate projects access and .Show() each other without circular dependency如何在没有循环依赖的情况下使单独项目中的 2 个表单相互访问和 .Show()
【发布时间】:2021-06-24 13:38:12
【问题描述】:

登录信息类

我有一个LoginInfo 类,它获取并设置用户登录的用户名,以跟踪多个表单或项目中的当前用户。

public class LoginInfo
{
    public static string Username = "NoLoginDetected";
    public static void SetLoginData(string un)
    {
        Username = un;
    }
    public static string GetLoginData()
    {
        return Username;
    }
}

用户实体

public class User:EntityBase
{
    public string Name{ get; set; }
    public string LastName { get; set; }

    public string Username{ get; set; } 
    public string Password{ get; set; } 

    public string UserType { get; set; }
}

我也有多个项目,但我们可以将它们分成 2 个主要部分。

1- 登录模块

此项目包含引用其他模块的登录表单,并根据登录授权指向相应模块的主表单。如果登录成功,也将用户名设置为LoginInfo.SetLoginData(username);

(例如,用户日志的 UserType = "Designer" -> 指向 Designer 模块 Main Menu)

2- 用户授权依赖模块/项目。

  • 设计器模块

包含一个主菜单,其中包含设计人员的某些任务。

  • 管理模块

包含一个主菜单,其中包含管理员的某些任务。


还有几个类似上面的模块。

我可以使用基本的登录表单访问其他模块

FormDesigner frm = new FormDesigner(); 
frm.ShowDialog();

但我也想阻止对这些模块的访问,如果有任何其他项目或其表单在登录表单的访问之外加载,并且如果是这种情况,则将用户重定向到登录表单。 问题是,我的登录项目已经引用了这些其他项目,因此由于循环依赖,我无法将登录项目添加为对它们的引用。

// - Designer or Admin Main Form

if(LoginInfo.GetLoginData() == "NoLoginDetected")
{ 
MessageBox.Show("No login detected. Redirecting to the login page..."); 
this.Hide();
// ---  HERE IS THE ISSUE  ------
FormLogin frmLogin = new FormLogin(); 
frmLogin.ShowDialog();
// Because i cannot add a referance to the Login Project since it causes Circular Dependency 
this.Close();
 }

总结

我的目标是能够通过单个登录表单/项目登录到其他模块,具体取决于登录用户的权限,同时还阻止访问其他模块,如果它们在没有登录的情况下被访问,从而导致返回登录表单。

【问题讨论】:

  • 看来你需要一些Events
  • 您可以创建另一个项目,引用这两个项目,并且每个表单都应该具有显示功能

标签: c# winforms visual-studio-2019 circular-dependency multiple-projects


【解决方案1】:

你可以这样试试:

  1. 添加一个项目(例如项目 A)作为另一个项目(项目 B)的参考。然后就可以从 B 项目中调用 A 窗口了。
  2. 在项目 A 中创建一个静态 Window 变量。将 B 窗口保存到 A 变量中。现在项目 A 可以显示项目 B 的窗口了。

如果您需要使用更多方法或字段/属性,请尝试使用反射。

【讨论】:

  • 感谢您的回复。将检查反射。对于静态变量的建议,我不知道如何在没有 B 窗口引用的情况下将 B 窗口保存到 A 变量中。我可以使用构造函数,但同样的规则也适用于它,因为即使只有 A 被初始化/调用,我也需要访问 A 内的 B 窗口。因此,当 A 初始化自身时,我无法在没有引用的情况下获得 B 窗口。
  • 从B项目创建A窗口时,可以将B窗口保存到静态A变量中
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2011-03-29
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2019-08-01
相关资源
最近更新 更多