【问题标题】:Disabling button from another class禁用另一个类的按钮
【发布时间】:2012-04-21 10:49:11
【问题描述】:

我知道以前有人问过这个问题或问过类似的问题,但没有一个解决方案可以解决我的问题。

我有一个带有名为hitButton 的按钮的winform。我需要做的就是从另一个类(即不是表单类)中禁用此按钮。

我的表单类是:

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;

我尝试了其他一些方法,但都没有奏效。我猜我遗漏了一些明显的东西,因为我尝试过的方法都没有奏效。

任何想法表示赞赏!

更新

我已经设法对文本框和图片框进行了后一种方法,与按钮有什么区别?

【问题讨论】:

  • 我只能想象你不是为了正确的按钮而做的。当您调用 DisableButtons 并将 false 设置为 Enabled 时,它应该完全可以解决问题。都是单线程的,对吧?
  • @YoryeNathan 是的,它是正确的按钮,而且都是单线程的。我就是不明白。
  • 尝试在实际有按钮的表单的ctor处将Enabled设置为false。只是为了测试一下。

标签: c# winforms button


【解决方案1】:

它不起作用的原因是您在BlackJackTable 的错误实例 上调用DisableButtons。您的 GameWon 类创建自己的、不可见的 BlackJackTable 对象,将其存储在 BlackJackTable blackJackTable 变量中,并禁用其按钮;对您可见的表单对象不会被修改。

要解决这个问题,您应该将BlackJackTable 表单的实例传递给GameWon 的构造函数,并将其设置为变量:

private readonly BlackJackTable blackJackTable;

public GameWon(BlackJackTable blackJackTable) {
    this.blackJackTable = blackJackTable;
}

创建GameWon 类实例的代码应该将表单作为参数传递给构造函数:

GameWon gameWon = new GameWon(myBjTable);

【讨论】:

  • @BaliC 请更新问题,显示您如何创建GameWon,以及您为其构造函数的参数传递了什么。如果你从BlackJackTable 的方法创建它,调用看起来像new GameWon(this);
【解决方案2】:

您可以向原始类返回一个值,然后禁用该按钮: 看一眼: How to call properties inside of a script runat at server

【讨论】:

  • 谢谢,但是它的 winforms,不是 asp。
【解决方案3】:

我最终使用后一种方法解决了这个问题,但将 Button 变量设为静态。

public static Button hit;

肯定是把类实例弄混了。感谢您的想法。

【讨论】:

    【解决方案4】:

    您在构造函数中做了很多工作。这通常是不好的做法,尤其是对于表单。在显示表单之前,您似乎正在修改表单上对象的属性 - 我并不惊讶这会产生不可预测的行为。如果我猜的话,我会想象在您的代码运行后通过表单初始化来重置按钮状态。表单非常保护自己的生命周期要求,我认为您一定遇到了与表单如何为显示做准备有关的特质。

    我必须指出,您在这里展示了一个非常奇怪的架构。我很难理解为什么你会选择以这种方式安排你的申请。我认为最好从控制器类与表单和游戏类进行通信,可能使用控制器中引发的事件来允许表单修改自身。让表单在屏幕上可见时修改自己的状态应该始终有效。

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2021-10-08
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多