我知道之前已经提出过这个问题或者提出了类似的问题但是没有一个解决方案能解决我的问题。
我有一个winform,其中有一个名为hitButton
的按钮。我需要做的就是从另一个类(即不是表单类)中禁用此按钮。
我的表单类是:
public partial class BlackJackTable : Form
{
}
我的单独课程是:
class GameWon
{
}
我尝试在BlackJackTable
中公开一个公共方法,如下所示:
public void DisableButtons()
{
hitButton.Enabled = false;
}
并从GameWon
构造函数访问(虽然在类中我从哪里访问它似乎并不重要),如下所示:
public BlackJackTable blackJackTable = new BlackJackTable();
public GameWon()
{
blackJackTable.DisableButtons();
}
我尝试在GameWon
中使用变量:
public Button hit;
并从blackJackTable分配:
GameWon gameWon = new GameWon();
public void Assign()
{
gameWon.hit = this.hitButton; // or just = hitButton;
}
并停用GameWon
:
hit.Enabled = false;
我尝试了其他一些东西,但没有一个能奏效。我猜我错过了一些明显的东西,因为我尝试过的方法都没有。
任何想法都赞赏!
更新
我设法用文本框和图片框来完成后一种方法,按钮的区别是什么?
答案 0 :(得分:3)
它不起作用的原因是您在DisableButtons
的错误实例上调用BlackJackTable
。您的GameWon
类创建自己的,不可见的BlackJackTable
对象,将其存储在BlackJackTable blackJackTable
变量中,并禁用其按钮;您可以看到的表单对象不会被修改。
要解决此问题,您应该将BlackJackTable
表单的实例传递给GameWon
的构造函数,并将其设置为变量:
private readonly BlackJackTable blackJackTable;
public GameWon(BlackJackTable blackJackTable) {
this.blackJackTable = blackJackTable;
}
创建GameWon
类实例的代码应该将表单作为参数传递给构造函数:
GameWon gameWon = new GameWon(myBjTable);
答案 1 :(得分:0)
您可以将值返回到原始类,然后禁用该按钮: 看一眼: How to call properties inside of a script runat at server
答案 2 :(得分:0)
我最后使用后一种方法修复此问题,但使Button变量静态。
public static Button hit;
一定是让课堂内容混淆了。谢谢你的想法。
答案 3 :(得分:0)
你在构造函数中做了很多工作。这通常是不好的做法,特别是对于表格。在表单显示之前,您似乎正在修改表单上对象的属性 - 我不会感到惊讶,这会产生不可预测的行为。如果我猜测,我想在代码运行后,通过表单初始化重置按钮状态。表单非常保护他们自己的生命周期要求,我认为你必须遇到一个特殊的问题来处理表单如何为显示做好准备。
我必须指出你在这里展示了一个奇怪的架构。我很难理解你为什么选择以这种方式安排你的应用程序。我认为最好从控制器类与表单和游戏类进行通信,可能使用控制器中引发的事件来允许表单自行修改。使表单在屏幕上可见时修改自己的状态应始终有效。