如何从另一个类访问WinForm组件?

7

我有一个表单,里面有一个按钮和两个标签。

我还有一个叫做myCounter的独立类。

我想让myCounter类能够通过一个名为changeColor的方法来访问表单中的标签。

如何使这些标签在这个类中可用?

表单:

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

        public Color colTurn
        {
            get { return lblp1Turn.BackColor; }
            set { lblp1Turn.BackColor = value; }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }

这个类

class myCounter
{
    private readonly Form1 Board;
    public myCounter(Form1 Board)
    {
        this.Board = Board;
    }

    public int turn = 0;


    public void changeColor()
    {

        if (turn == 0)
        {
            turn = 1;
            lbl

           //change color code here
        }
    }
}

@Jon B,你对我的问题做了什么啊? - Tacit
@Tacit:点击“x分钟前编辑”,然后您将看到修订历史记录。 - Patrick
他纠正了我的拼写,这有什么意义呢? - Tacit
@Tacit:你说你已经尝试了“获取和设置”,但是你是否真正设置了值,例如Board.colTurn = Color.Red - Patrick
1
@Tacit - 我修复了一个小的代码格式问题,以使您的问题更易于阅读。请不要生气。这是 Stack Overflow 工作方式的一部分。 - Jon B
显示剩余4条评论
2个回答

5

看起来你正在将整个表单传递到你的第二个类中,所以我建议你按照LightStriker的建议去做。为所有项目创建一个公共访问器,并在另一个类中进行设置。

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

        public Label MyLabel1
        {
            get {return mylabel1;}
        }

        public Label MyLabel2
        {
            get {return mylabel2;}
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _counterClass = new myCounter(this);
        }

        protected void ButtonClick(object sender, EventArgs e)
        {
            _counterClass.changeColor();
        }
    }

在您的第二个类中,您可以访问您的标签。
class myCounter
{
    private readonly Form1 Board;
    public myCounter(Form1 Board)
    {
        this.Board = Board;
    }

    public int turn = 0;


    public void changeColor()
    {

        if (turn == 0)
        {
            turn = 1;
            Board.MyLabel1.BackColor = Color.Red;
            Board.MyLabel2.BackColor = Color.White;
        }
        else
        {
            turn = 0;
            Board.MyLabel2.BackColor = Color.Yellow;
            Board.MyLabel1.BackColor = Color.White;
        }
    }
}

请记住,这是我在维基标记编辑器中编写的代码,尚未经过测试。但是这应该适用于您。


你想要改变的属性是什么?你想要改变背景颜色(BackColor)对吧? - EJC
好的,假设您在formLoad中创建并保持了一个名为myCounterClass的类实例,那么这段代码应该可以在第一次按钮点击时正常工作。除了changeColor方法之外,还有其他任何东西会设置“Turn”吗? - EJC
你是否曾经将标签1或2设置回白色? - EJC
是的,这将发生在颜色变化的代码中。 - Tacit
你知道为什么无法从Form类访问你的Labels吗?因为它们被保护了。 - EJC
显示剩余6条评论

3
在您的表单上创建一个公共方法来实现此功能。
public partial class Form1 : Form{
    public void SetLabelColor(Color color){
        mylabel.BackColor = color;
    }
    //... Other code
}

那么我该如何在类中使标签可用? - Tacit
为什么要使用部分类? - Tacit
@Tacit:这只是从你的代码复制过来的。部分类是因为它是一个表单,而你在一定程度上使用.designer.cs文件与代码后台cs文件。 - Patrick
@Tacit:另外,“使标签可用”没有任何意义。您声明要公开标签的颜色,这正是Oscar在类中使用方法提供的内容。 - Patrick
我可以在类中使用一个方法来完成它,但我希望在表单类之外完成所有操作。 - Tacit
@Tacit:您能否具体说明一下您最后一条评论中的“它”和“一切”是什么。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接