C# 使按钮更改为公共值

C# 使按钮更改为公共值,c#,winforms,button,C#,Winforms,Button,我在VisualStudio工作 我有以下表格: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace

我在VisualStudio工作

我有以下表格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {

        }

        public static int signal = 0;

        public void button1_Click(object sender, EventArgs e)
        {

        }
    }
}
以及此用户控件:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

            if (Form1.signal == 1)
            {
                MessageBox.Show("Signal received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }
    }
}
当点击“Form1”中的“button1”时,我抬起头试图显示“UserControl1”中的“MessageBox”。基本上,我想在按下“按钮1”时将“信号”的值更改为1。我是新手,但我在这里时间紧迫,所以非常欢迎提供帮助。有什么想法吗?谢谢大家!

按钮1\u Click是当您从表单中单击按钮时将触发的事件


按照其他用户的建议创建一个事件,或者参考问题并创建一个自定义消息框,其中包含您的UserControl作为其内容。

加载UserControl时,它会将Form1.signal视为0,因为您使用该值对其进行了初始化。您的UserControl1永远不会知道Form1上的更改

您需要做的是使UserControl1中的侦听器函数被触发,比如说每1000毫秒一次,这将检查Form1.signal==1


检查Interval library,我建议您花点时间学习C语言。该语言非常棒。

处理容器之间通信的最佳方法是实现一个observer类

观察者模式是一种软件设计模式,其中一个对象(称为subject)维护其从属对象(称为观察者)的列表,并通常通过调用其方法之一自动通知其任何状态更改。 维基百科

我这样做的方式是创建一个Observer类:

1    public delegate void dlFuncToBeImplemented(int signal);
2    public static event dlFuncToBeImplemented OnFuncToBeImplemented;
3    public static void FuncToBeImplemented(int signal)
4    {
5         OnFuncToBeImplemented(signal);
6    }
所以基本上:第一行说会有一个其他人将实现的函数

第二行是创建一个事件,该事件在委托函数调用时发生

第三行是创建调用事件的函数

因此,您应该在UserControl中添加如下函数:

private void ObserverRegister()//will contain all observer function registration
{
    Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
    /*and more observer function registration............*/
}


void Observer_OnFuncToBeImplemented(int signal)//the function that will occur when  FuncToBeImplemented(signal) will call 
{
    MessageBox.Show("Signal received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
在你的状态下,你应该做如下事情:

public static int signal = 0;

public void button1_Click(object sender, EventArgs e)
{
      Observer.FuncToBeImplemented(signal);//will call the event in the user control
}
现在,你可以把这个函数注册到一大堆其他的控件和容器中,它们都会得到信号


我希望这会有所帮助:

即使您更改表单中变量信号的值,用户现在如何控制何时发生这种情况?您需要定义一个自定义事件,定义相应的事件处理程序,并将两者连接起来。正如我所说,我是新手,我的知识非常有限。当然,解决这个问题的最好办法是花时间学习这个程序,但不幸的是我没有时间。我以后再做。我举一个你所说的例子就好了!我一定会的!我现在正忙着做一个小项目。但是,按下按钮时,信号会变为1吗?它将在按钮内部更改,但会在外部传输吗?我知道如何创建间隔,但我不知道如何创建侦听器。是的,它会。当您更改信号变量的值时,侦听器函数将知道发生了类似的情况。侦听器函数将每隔10毫秒借助interval调用一次,例如我放置了一个“wait Task.Delay10;”除了“if”语句和“MesageBox”在“while”循环中之外,它还起作用。这是侦听器应该是的还是库中有预定义的内容?