【问题标题】:Calling a function from another form c#从另一个表单c#调用函数
【发布时间】:2017-03-11 22:41:19
【问题描述】:

我有一个主窗体,其功能可以更改主窗体上的文本框的文本,代码如下:

主窗体函数:

    public void consoleLog(string message)
    {
        txtConsoleLog.Text += Environment.NewLine;
        txtConsoleLog.Text += message;
        txtConsoleLog.SelectionStart = txtConsoleLog.TextLength;
        txtConsoleLog.ScrollToCaret();
        txtConsoleLog.Refresh();
    }

所以现在当我点击这样的按钮时,我会打开一个名为 frm connect 的新表单:

    private void connectToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form frmConnect = new FrmConnect(this);
        frmConnect.Show();
    }

这是下面的frmConnect

public partial class FrmConnect : Form
{
    private Form mainForm;

    public FrmConnect(Form frmMain)
    {
        this.mainForm = frmMain;
        InitializeComponent();
    }

    private void btnConnect_Click(object sender, EventArgs e)
    {
        FrmMain.Connected = true;
        mainForm.consoleLog("Connected");
    }
}

因此,当我单击一个按钮时,我想调用该函数,但它说它不包含它的定义,我也试图更改主窗体上的“已连接”变量,该变量仅通过引用 FrmMain 来工作,但我我可以使用 mainForm.Connected = true 做到这一点吗?

如果我将函数更改为公共静态,它将通过引用 FrmMain 来工作,但随后我会在 txtConsoleLog 中遇到错误,因为我无法在非静态方法或类似方法中引用对象,需要任何帮助

【问题讨论】:

    标签: c#


    【解决方案1】:

    当您将表单传递给构造函数并将其存储为私有成员变量时,您在这两个地方都将其声明为基类型Form。为了在您定义的类型上使用方法,您的参数和变量应该是 FrmMain 类型。

    public partial class FrmConnect : Form
    {
        private FrmMain mainForm;
    
        public FrmConnect(FrmMain frmMain)
        {
            this.mainForm = frmMain;
            InitializeComponent();
        }
    
        private void btnConnect_Click(object sender, EventArgs e)
        {
            FrmMain.Connected = true;
            mainForm.consoleLog("Connected");
        }
    }
    

    【讨论】:

    • 现在它说“当我尝试这样做时,不能将类型 system.windows.Forms.Form 隐式转换为 Project1.FrmMain。mainForm = frmMain;
    • 像我一样在两个地方都改变它。你的private Form mainForm;
    【解决方案2】:

    你应该改变

    private Form mainForm;
    
    public FrmConnect(Form frmMain)
    {
    

    private FrmMain mainForm;
    
    public FrmConnect(FrmMain frmMain)
    {
    

    稍后将允许您在FrmConnect 类的其他方法中访问FrmMain 上的所有公共属性。

    【讨论】:

    • 现在它说“当我尝试这样做时,不能将类型 system.windows.Forms.Form 隐式转换为 Project1.FrmMain。mainForm = frmMain;
    • 你确定你在两个地方都改了类型吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多