【问题标题】:C# - Using two forms, access a variable from the first formC# - 使用两种形式,从第一种形式访问变量
【发布时间】:2025-12-21 22:40:07
【问题描述】:

我已经为此苦苦挣扎了一个星期,我没有看到任何其他问题。我需要做一些事情,比如Accessing Forms data from another form,但我需要从第二个表单访问第一个表单代码中的变量,并且点击事件发生在第二个表单期间。

这是第一个表单(mainForm's)的一些代码:

namespace Sudoku
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
        difficultyForm difForm = new difficultyForm();
        public string difficulty = "";

        private void generateNewPuzzleMenuItem_Click(object sender, EventArgs e)
        {
            generateBegin();
        }

        private void generateBegin()
        {
            difForm.Show();
            difForm.difficultyTextBox.Text = "";
            difForm.difficultyTextBox.Focus();

这里是第二个表单(difficultyForm)的一些代码:

namespace Sudoku
{
    public partial class difficultyForm : Form
    {
        string difficulty = "";

        public difficultyForm()
        {
            InitializeComponent();
        }

        private void enterButton_Click(object sender, EventArgs e)
        {
            difficulty = difficultyTextBox.Text;

            if (difficulty != "1" && difficulty != "2" && difficulty != "3" && difficulty != "4" && difficulty != "5")
                MessageBox.Show("The difficulty must be an integer from 1 to 5.", "Difficulty Error", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            else
            {
                this.Hide();
            }

我也是 C# 的菜鸟,所以如果你有任何其他很棒的建议,谢谢。

注意:由于代码中的某些内容,我使用字符串来表示难度,所以请不要告诉我使用整数,谢谢。

【问题讨论】:

  • 是要获取第一种形式的变量的值,还是设置?
  • 您的主表单不应将其他表单中的文本空白或设置文本框的焦点。这些事情应该在第二种形式中完成。文本框甚至不应该公开。
  • 我想从第二种形式中获取一个变量,并在第一种形式中设置一个等于它的变量,以便我可以在那里使用它。

标签: c# winforms visual-studio-2010


【解决方案1】:

要将信息从第二个表单推送到主表单,您应该使用事件。在第二个表单上创建事件并在单击按钮时触发它:

public partial class difficultyForm : Form
{
    string difficulty = "";

    public difficultyForm()
    {
        InitializeComponent();
    }

    public event Action<string> DifficultySubmitted;

    private void enterButton_Click(object sender, EventArgs e)
    {
        difficulty = difficultyTextBox.Text;

        if (DifficultySubmitted != null)
            DifficultySubmitted(difficulty);

        //...
    }
}

然后在主窗体上订阅该事件:

private void generateBegin()
{
    difForm.Show();
    difForm.difficultyTextBox.Text = "";
    difForm.difficultyTextBox.Focus();
    difForm.DifficultySubmitted += newDifficulty => difficulty = newDifficulty;
}

【讨论】:

  • 我试过了,但难度(第一种形式)似乎没有设置为我在第二种形式中输入的难度。我将难度值分配给第一个表单上的文本框,但文本框中没有任何内容。
  • @Toje 你是否在提交难度时触发的事件处理程序中设置了它?那可能是这样做的合适地方。
  • 很抱歉传入的菜鸟问题,但究竟什么是事件处理程序?
  • @Toje 触发事件时调用的方法。在这种情况下,newDifficulty =&gt; difficulty = newDifficulty; 正在创建一个匿名方法,该方法在DifficultySubmitted 被触发时被调用。
  • 好的,谢谢,但是我如何在事件处理程序中设置难度? (如果您可以发布参考或其他很棒的东西;我可以尝试自己学习,我以前从未使用过这些东西 - 我主要使用 C++ 编程)
【解决方案2】:

如果我正确理解你的困难,你可能想看看事件处理。

定义一个自定义事件参数类(例如:DifficultyEventArgs 什么的)。定义一个带有一个参数的委托作为您的事件参数

用类中的委托声明一个事件..

在您要观察的属性的 setter 方法中调用委托。

在另一种形式中,您可以订阅此事件,以监控对其所做的任何更改。这只是一种方式。

另外,DifficultyLevel 最好使用枚举,而不是字符串。

【讨论】:

    【解决方案3】:

    您可以在 DificultForm 的构造函数参数中传递 Form1,从而访问 Form1 的控件

    【讨论】:

      【解决方案4】:

      如果您想要做的只是在特定情况下获取第二个表单的 TextBox 的值,您可以在第二个表单的代码中创建一个公共方法

      public string GetTxtBoxValue()
              {
                  return difficultyTextBox.Text;
              }
      

      然后从第一个表单调用它。

      但是,如果您想要更好地控制它,我建议您使用事件。

      【讨论】: