C#使按钮更改公共值

时间:2018-04-15 09:32:14

标签: 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 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)
        {

        }
    }
}

我低下头试图展示“消息框”'来自' UserControl1'当' button1'来自' Form1'点击。基本上,我想改变' signal'的价值。当'按钮1'被压了。我是新手,但是我被时间紧迫,所以非常欢迎你的帮助。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

button1_Click是您单击表单中的按钮时将触发的事件。

创建与其他用户建议相似的活动,或参考this问题并创建一个自定义消息框,其中包含UserControl作为其内容。

答案 1 :(得分:0)

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

你需要做的是在UserControl1中设置将被触发的侦听器功能,让我们每10毫秒说一次,这将检查Form1.signal == 1.

检查Interval库,我建议你抽出时间学习一些C#。语言很棒。

答案 2 :(得分:0)

处理容器之间通信的最佳方法是实现观察者类

观察者模式是一种软件设计模式,其中一个称为主体的对象维护其依赖者列表,称为观察者,并通常通过调用其中一种方法自动通知它们任何状态变化。 (维基百科)

我这样做的方法是创建一个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
}

现在,您可以将此功能注册到一大堆其他控件和容器中,它们都将获得信号

我希望这会有所帮助:)。