如何从UserContol调用方法?

时间:2019-01-05 10:17:48

标签: c# winforms user-controls

我的程序中有许多UserControl。没有输入密码,只有一个用户控件(默认)可见。

如果需要查看其他用户控件,则用户必须输入密码,然后,应立即出现另一种形式(用户单击呼叫的按钮)。

对于模型,我们有2个用户控件。 第一个将在启动时立即打开,要打开第二个,我们必须单击其启动按钮,然后将出现一个密码输入,并且(如果密码正确)将打开所需的表格。

最后一个代码显示是我的问题。

我有UserLeftPanel总是作为左面板和MainForm(在代码Form1中)消失。 在LeftUserPanel中,有许多按钮被点击,Form1将使UserControl上扬。 我不明白如何正确地从基类(Form1)中获取方法。

专门针对我的程序: 而且,如果调用的所有用户逻辑都不正确,我将很高兴看到正确的调用。

通过单击显示的每个UserControl都具有这种构造

 private static UserMainPanel_Saved instanse;
    public static UserMainPanel_Saved Instanse
    {
       get
        {
            if(instanse==null)
                instanse =new UserMainPanel_Saved();
            return instanse;
        }
    }

UserLeftPanel中的代码

  public delegate void Handler(object sender,EventArgs e, int control) ;
    public event Handler  ButtonClick;
  protected void ButtonSavedMessages_Click(object sender, EventArgs e)
    {
        int formnumber = 0;          
            this?.ButtonClick(this, e,formnumber);// There are ButtonClick Event in Form1
    }

Form1中的代码

 private void userLeftPanel1_Load(object sender, EventArgs e)
    {
        userLeftPanel1.ButtonClick += UserControl_ButtonClick;
        UserControl_ButtonClick(sender, e, 0);//to display form without password by default
    }
public  void UserControl_ButtonClick(object sender, EventArgs e,int number)
    {
        UserControl con=null ;
        if (number == 0)
             con = UserMainPanel_Saved.Instanse;
        else
        {               
                if (UserPassword.Password)
                {
                    if (number == 1)
                        con = UserMainDaybook.Instanse;
                }
                else
                {
                    con = UserPassword.Instanse;
                }
        }

        if (!MainPanel.Controls.Contains(con))
        { 
           MainPanel.Controls.Add( con);
           con.Dock = DockStyle.Fill;
           con.BringToFront();
        }          
        else
        {
           con.BringToFront();
        }
    }

“ UserPassword”中的代码

 private void button1_Click(object sender, EventArgs e)
    {
        Password = true;// In this place will be Some Logic
   //And my idea is to Invoke there UserControl_ButtonClick( ... ) method, but I don't know how
    }

1 个答案:

答案 0 :(得分:1)

您可以尝试使用逻辑将事件与方法分离(请注意两种不同的方法:UserControl_ButtonClickUserControlClick

public void UserControl_ButtonClick(object sender, EventArgs e, int number)
{
    UserControlClick(number);
}

public void UserControlClick(int number)
{
    UserControl con=null ;
    if (number == 0)
         con = UserMainPanel_Saved.Instanse;
    else
    {               
            if (UserPassword.Password)
            {
                if (number == 1)
                    con = UserMainDaybook.Instanse;
            }
            else
            {
                con = UserPassword.Instanse;
            }
    }

    if (!MainPanel.Controls.Contains(con))
    { 
       MainPanel.Controls.Add( con);
       con.Dock = DockStyle.Fill;
       con.BringToFront();
    }          
    else
    {
       con.BringToFront();
    }
}```

然后在UserPassword中输入:

private void button1_Click(object sender, EventArgs e)
{
    Password = true;// In this place will be Some Logic
    Form1.Instance.UserControlClick(0);
    //And my idea is to Invoke there UserControl_ButtonClick( ... ) method, but I don't know how
}

这样,您无需发送object sender, EventArgs e, int number,只需发送号码即可。