Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c从form2激活form1上的面板_C#_Winforms_Visual Studio - Fatal编程技术网

C# c从form2激活form1上的面板

C# c从form2激活form1上的面板,c#,winforms,visual-studio,C#,Winforms,Visual Studio,因此,我正在开发一个订购系统,当从form2下订单时,会在form1上显示一个带有消息的面板。。但它似乎不起作用,请帮忙 int chkComm1 = comm1.ExecuteNonQuery(); if(chkComm1 == 1) { //so basically if query call is successful (which it is) it should open

因此,我正在开发一个订购系统,当从form2下订单时,会在form1上显示一个带有消息的面板。。但它似乎不起作用,请帮忙

                int chkComm1 = comm1.ExecuteNonQuery();

            if(chkComm1 == 1)
            {
                //so basically if query call is successful (which it is) it should open a panel with message on my main program or form1, but It doesnt work? anyone help?
                Main_Program mp = new Main_Program();
                mp.orderALERT.Enabled = true;
                mp.orderALERT.Visible = true;
                mp.Refresh();

            }
在此代码之后,它应该显示面板,但什么也没有发生,如果有人可以帮助我,请做!谢谢

问题:您的代码无法工作,因为您创建了form1的新实例,该实例与应用程序中已有的主窗体不相关:

Main_Program mp = new Main_Program(); // here
解决方案:您应该使用已经打开的form1。这在事件中很容易做到。在form2上创建一个事件:

public event EventHandler OrderPlaced;
并在下订单时提出:

int chkComm1 = comm1.ExecuteNonQuery();

if(chkComm1 == 1)
{
    OrderPlaced?.Invoke(this, EventArgs.Empty);
}
在form1上订阅form2的活动:

form2.OrderPlaced += Form2_OrderPlaced;
在事件处理程序激活面板中:

private void Form2_OrderPlaced(object sender, EventArgs e)
{
    orderALERT.Enabled = true;
    orderALERT.Visible = true;
}

将Main_程序的实例传递给Form2的Show方法,如下所示:

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show(this); // pass in THIS instance of Main_Program as the "Owner"
    }

}
现在,在表单2中,您可以将所有者转换回Main_程序并进行操作。但是,要访问orderALERT面板,必须将其Modifiers属性更改为public:

public partial class Form2 : Form
{

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (this.Owner != null && this.Owner is Main_Program)
        {
            Main_Program mp = (Main_Program)this.Owner;
            mp.orderALERT.Enabled = true;
            mp.orderALERT.Visible = true;
            mp.orderALERT.Refresh();
        }
    }

}

Main_程序是表单吗?你没有出示那张表格。除非刷新应该这样做?是的,这是一个windows窗体,也就是我的主程序,它看起来是这样的:当我单击“从第二个窗体付款”后,它将以绿色显示我使用的消息,以通知有新订单可用。消息在默认情况下隐藏,直到有活动订单。刷新应该在主程序出现后刷新,但不会发生任何事情..好的,但您从未在窗体实例上调用.Show。如果一开始从未显示表单,则无法在表单上显示该表单。我想你在什么地方已经有过这种形式的例子了?在这种情况下,你不应该做一个新的。当我写这篇文章的时候,一个不断改进的答案就写在下面,你一定要去那里。它已经在后台打开了。它就像启动程序时的启动窗体。第二个窗体在不关闭主程序窗体的情况下打开。但是当我执行我发布的程序时,我的主程序表单不会更新。要么是错误的代码,要么是我做错了什么我得到这个消息是出于某种原因:O@Rin请确保薪酬是form2@Rin当我尝试访问PAY.OrderPlaced时,它会将我作为类名来查找。它甚至不会显示,因为我没有访问权限@Rin您是否在上述表格2中定义了事件?公共事件事件处理程序;它在我的模型示例中非常有效,所以你做错了什么。确保没有任何新的关键字生成Main_程序的实例。还要确保没有任何Try/Catch块通过不处理异常来隐藏异常。嗯,奇怪,还有其他方法吗?编辑:我又试了一次,它对我不起作用::然后你的设置有些地方不是很正确,或者你没有解释得足够详细。我设法和你上面发布的其他人一起做了,但我还是会想办法弄明白为什么这一条不适合我的教育目的:谢谢你帮助兄弟