【问题标题】:Controlling a button from another form c#从另一个表单c#控制一个按钮
【发布时间】:2016-11-29 15:31:56
【问题描述】:

我有这个项目,您可以在其中以用户和员工身份登录,如果您以员工身份登录,某些按钮(例如报告)将显示在主页上。

我有两个名为 HomePagefrmSignIn 的表单。如果用户从frmSignIn 登录,我希望HomePage 上的某个按钮可见。我尝试了几种方法,但无法使其正常工作。

我确实创建了public 按钮以查看它是否有效,尽管我知道这是不好的做法。

if (ValidCredentials(txtUsername.Text, txtPassword.Text) == true && checkBoxEmployee.Checked == true && txtBoxEmpPin.Text.Equals(employeePin))
{
    this.DialogResult = DialogResult.OK;
    this.Tag = _usersId;
    this.Close();
    MessageBox.Show("You have successfully logged in as an employee.");

    HomePage hp = new HomePage();

    hp.Button.Visible = true;   // !!!! Does not work !!!!
}

【问题讨论】:

  • 您似乎想要基于角色的安全性,您可以使用全局变量/类。 stackoverflow.com/questions/1293926/…
  • hp是另一个首页实例,与实际首页完全不同
  • 我认为他是从登录页面调用它。
  • 感谢您的回复。那我该怎么改呢?
  • 是的,我从登录页面调用它。

标签: c# winforms


【解决方案1】:

一种方法是让 frmSignIn 知道您的原始主页。

为此,您可以在 frmSignIn 中创建一个属性,例如

public MyHomePage Form { get; set; }

然后,在创建 SignIn 表单时,还要将主页的引用添加到新的 frmSignIn 实例中。比如:

var mySignInForm = new frmSignIn();
mySignInForm.MyHomePage = this;

现在,您的 frmSignIn 中有一个不错的参考,可以做任何您想做的事情。不过,您仍然必须公开该按钮。

或者,您可以使用相同的方式添加对所需按钮的引用,而不是完整的表单。

这可能不是最漂亮和最优雅的解决方案,但它会起作用。

【讨论】:

    【解决方案2】:

    您可以在保留对按钮的引用的地方使用公共属性,试试这个例子。

    表格1

    public partial class Form1 : Form
    {
    
    
    
        public Form1()
        {
            InitializeComponent();
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 x = new Form2();
            x.Button1 = this.button1;
            x.Show();
        }
    }
    

    Form2

    public partial class Form2 : Form
        {
            private Button _button1;
    
            public Button Button1
            {
                get { return _button1; }
                set { _button1 = value; }
            }
    
            public Form2()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _button1.Visible = false;
            }
        }
    

    【讨论】:

      【解决方案3】:

      homepage 创建一个启用Button 的方法

      public void EnableButton(){
         this.Button.Visible = true;
      }
      

      然后这样做,

      this.DialogResult = DialogResult.OK;
      this.Tag = _usersId;
      HomePage hp = new HomePage();  //here, creating instance of homepage
      hp.EnableButton(); //This enables the required button
      MessageBox.Show("You have successfully logged in as an employee.");
      hp.showDialog(); //Shows HomePage
      this.Hide(); //Hides login page.
      

      【讨论】:

      • 这可行,但它会打开另一个主页表单,这让我在登录时有 2 个。我有一个初始的,在登录时启动并且登录表单作为模式表单弹出,但是第一个主页永远不会关闭。
      • 是的,所以当我运行程序时,会打开一个主页屏幕。从这个主页我可以登录并打开 frmSignIn 表单。但是,主页永远不会关闭,所以当我尝试您的方法时,它只会打开另一个主页。
      • 然后不要创建新实例。删除这个 --> HomePage hp = new HomePage(); 另外,该主页实例的引用在哪里?
      • 该实例只需致电EnableButton()。它应该工作。并将button 恢复为私有。
      • 不不,对不起。也许我没有解释清楚。该程序从主页开始。主页有一个名为 Sign In 的按钮,它打开 frmSignIn 但从不关闭初始主页表单。如果我通过 frmSignIn 以员工身份登录,我希望“按钮”可见。
      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 2015-03-25
      • 2016-05-26
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多