C#从外部当前类调用函数

时间:2012-04-20 04:52:14

标签: c# function invoke

目前有一个mainForm.cs,它调用类panel.cs

panel.cs包含多个图片框,其中包含_click,_mousedown,_mouseup

等事件

我希望从panel.cs

调用mainForm.cs中的函数

我需要使用回调/委托吗?有没有其他方法可以访问此功能

我试过了 Main main = new Main(); main.functioninMain不起作用

任何帮助或指示将不胜感激。

例如

panel.cs
  private void pb_button1_Click(object sender, EventArgs e)
  {
    this.BeginInvoke(new Action(main.functioninMain));
  }

3 个答案:

答案 0 :(得分:1)

您不应该实例化MainForm的另一个对象,它会创建一个副本,所有带有新MainForm的对象都不会具有您的实际MainForm的值。

方法1 您可以尝试创建MainForm的静态实例,如下所示

public partial class MainForm : Form
{
    public static MainForm Instance = null;
    public MainForm()
    {
        InitializeComponent();
        Instance = this;
    }
    public SomeMethod()
    {
    }
}

现在,如果你有面板类,那么你可以轻松访问MainClass的公共方法和变量

class Panel : Form
{
    public Panel()
    {
        MainForm.Instance.SomeMethod();
    }

}

编辑:将句柄作为参数传递给表单(来自Ben Voigt的建议)

方法2:

正如Ben建议的那样,拥有更安全的代码也很重要,因此更清晰的方法是将控件的句柄作为参数传递,然后再访问它们。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass test = new TestClass();
        test.ModifyText(textBox1);
    }
}

public class TestClass
{
    public void ModifyText(TextBox textBox)
    {
        textBox.Text = "New text";
    }
}

答案 1 :(得分:1)

如果我们可以使用代表和像这样的事件

public partial class MainForm : Form
{
        public MainForm()
        {
            InitializeComponent();
        }

    private void button1_Click(object sender, EventArgs e)
    {
        Panel formPanel = new Panel();
        formPanel.OnPanelClick += new Panel.OnPanelButtonClick(formPanel_OnPanelClick);
        formPanel.Show();
    }

    void formPanel_OnPanelClick(string a)
    {
        MessageBox.Show(a);
    }
}

public partial class Panel : Form
{
    public delegate void OnPanelButtonClick(string a);
    public event OnPanelButtonClick OnPanelClick = null;

    public Panel()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (OnPanelClick != null)
        {
            OnPanelClick("from Panel.cs");
        }
    }
}

答案 2 :(得分:0)

你应该不惜一切代价避免循环依赖(A类依赖于B类,B类依赖于A类)。

有很多方法可以做到这一点,但也许一种更简单的方法是使用界面。 mainForm.cs实现如下:

public class mainForm : IMainForm {
  // This method is defined in the interface, so mainForm
  // must implement it.
  public string GetStringFromMainForm() {
    return "Hello from MainForm";
  }

  public void CreatePanel() {
    // pass in a reference to myself so panel knows how to
    // talk to me.
    var panel = new Panel(this);
  }
}

IMainForm(界面)看起来像这样:

public interface IMainForm {
  string GetStringFromMainForm();
}

然后您的面板类可以与Main表单进行通信,而无需明确引用mainForm.cs:

public class Panel {
  // use a private variable to keep track of main form
  private IMainForm _mainForm;

  // Constructor: pass in a class that implements IMainForm. It isn't
  // a type of MainForm, so there's no dependency on the concrete class.
  public Panel(IMainForm mainForm) {
    _mainForm = mainForm;
  }

  public void TalkToMainForm() {
    var resultFromMainForm = _mainForm.GetStringFromMainForm();
    Console.WriteLine(resultFromMainForm);
  }
}