【问题标题】:Setting Variable In One Class And Returning Value To Another在一个类中设置变量并将值返回给另一个类
【发布时间】:2019-01-12 08:11:24
【问题描述】:

我正在学习 C# 并尝试创建一个 public bool 类变量,该变量的值将设置在一个类中,然后传递回调用类。我尝试了下面的代码,但是当它返回到VerifyForm 时,布尔值是 ALWAYS false,即使单步执行我的代码,我也看到在我的类 IntelOrNo 中,该值是正确的设置。

对于更有经验的 C# winforms 程序员,我应该如何编写代码,以便正确设置变量 rttam 的值并在类之间传递?

    using System;
using System.Windows.Forms;

namespace CTX
{
    public partial class VerifyForm : Form
    {
        public static IntelOrNo ai = new IntelOrNo();

        public VerifyForm()
        {
            InitializeComponent();
        }

        private void btnOkay_Click(object sender, EventArgs e)
        {
            ai.rttam = true;
            this.Close();
        }

        private void btnNo_Click(object sender, EventArgs e)
        {
            ai.rttam = false;
            this.Close();
        }
    }

    public partial class IntelOrNo : Form
    {
        public bool rttam = false;

        public IntelOrNo()
        {
            InitializeComponent();
        }

        private void btnDoThisWork_Click(object sender, EventArgs e)
        {
            VerifyForm EH = new VerifyForm();
            EH.StartPosition = FormStartPosition.CenterParent;
            EH.ShowDialog();

            if (rttam)
            {

            }           
        }
    }
}

【问题讨论】:

  • 首先,您可能需要花费一些字母来获得更好的名称 (rttam)。然后,您的 bool 永远不会“返回”任何地方。它始终是ai 对象的一部分。您在哪里检查任何内容都不清楚,因为在您更改 rttam 后,VerifyForm 会立即关闭

标签: c# winforms variables boolean


【解决方案1】:

老实说,我只是删除静态变量。并为 VerifyForm 类提供一个构造函数,该构造函数需要 IntelOrNo 表单。

using System;
using System.Windows.Forms;

namespace CTX
{
    public partial class VerifyForm : Form
    {
        public IntelOrNo _parent;

        public VerifyForm(IntelOrNo parent)
        {
            _parent = parent;
            InitializeComponent();
        }

        private void btnOkay_Click(object sender, EventArgs e)
        {
            _parent.rttam = true;
            this.Close();
        }

        private void btnNo_Click(object sender, EventArgs e)
        {
            _parent.rttam = false;
            this.Close();
        }
    }

    public partial class IntelOrNo : Form
    {
        public bool rttam = false;

        public IntelOrNo()
        {
            InitializeComponent();
        }

        private void btnDoThisWork_Click(object sender, EventArgs e)
        {
            VerifyForm EH = new VerifyForm(this);
            EH.StartPosition = FormStartPosition.CenterParent;
            EH.ShowDialog();

            if (rttam)
            {

            }           
        }
    }
}

或者,如果您真的只是想打开一个是否对话框,我建议在您的 btnDoThisWork_Click 事件中像这样使用 MessageBox

DialogResult dialogResult = MessageBox.Show("Do you want to continue?", "Continue?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
     //do something
}
else if (dialogResult == DialogResult.No)
{
     //do something else
}

【讨论】:

  • Ups 忘记从父级移除静电^^。
  • 这行得通 - 非常感谢!我很困惑如何像VerifyForm EH = new VerifyForm(this); 这样调用第二种形式并在第二种形式public static IntelOrNo _parent; 中有一个变量允许值从表单传递到表单/类到类?
  • 那么您的启动表单似乎是 IntelOrNo。通过在按钮上按“btnDoThisWork_Click”创建另一个表单,您可以为您打开的表单提供对 IntelOrNo 的引用。因此,您的 VerifyForm 可以更改此参考中的变量。
  • 啊 - 这很有意义。感谢您的宝贵见解和解释!!!
  • 没问题很高兴我能帮上忙^^。即使你只是想实现一个是非对话并想要结果我真的推荐 MessageBox :)。
【解决方案2】:

您可以通过构造函数将类引用传递给分部类并以这种方式返回变量,尽管我不确定从代码 sn-p 中您尝试在 VerifyForm 类中访问 rttam 的位置。

目前它可能无法正常工作的原因是因为您正在创建类的多个实例。在 IntelOrNo 类中,您声明了一个 new VerifyForm 类,这将创建该类的全新实例,并且引用您最初拥有的类。

目前您的代码正在执行此操作:

  1. 创建新的 VerifyForm 实例
  2. 创建新的 IntelOrNo 实例
  3. 创建新的 VerifyForm 实例

您将无法通过第二个 VerifyForm 将变量传递到第一个 VerifyForm,它们是不同的类。

回到潜在的修复,使用 this 关键字,您可以将第一个 VerifyForm 传递给 IntelOrNo 并从那里访问它。

  using System;
using System.Windows.Forms;

namespace CTX
{
    public partial class VerifyForm : Form
    {
        public static IntelOrNo ai = new IntelOrNo(this);//Pass this class as a parameter

        public VerifyForm()
        {
            InitializeComponent();
        }

        private void btnOkay_Click(object sender, EventArgs e)
        {
            ai.rttam = true;
            this.Close();
        }

        private void btnNo_Click(object sender, EventArgs e)
        {
            ai.rttam = false;
            this.Close();
        }
    }

    public partial class IntelOrNo : Form
    {
        public bool rttam = false;
        private VerifyForm parent

        public IntelOrNo(VerifyForm _parent)
        {
            parent = _parent; //Sets the private parent variable to the initial VerifyForm class, from here you can access the initial VerifyForm class through parent.whatever
            InitializeComponent();
        }

        private void btnDoThisWork_Click(object sender, EventArgs e)
        {
            VerifyForm EH = new VerifyForm(); //This creates a NEW instance of the class, not what you want (I think)

            parent.StartPosition = FormStartPosition.CenterParent;
            parent.ShowDialog();

            if (rttam)
            {

            }           
        }
    }
}

我希望这会有所帮助,如果我误解了这个问题,请随时澄清,我会再次尝试回答。 :)

【讨论】:

  • 在我的 verifyform 类中,我只设置 rttam 的值 - 我想访问在 IntelOrNo 类中设置为 verifyform.rttam 的值。那有意义吗?我会测试你的解决方案:)
  • 您可以使用 IntelOrNo 类中的 parent.rttam 访问它,但变量 rttam 实际上是从 IntelOrNo 内部声明的,因此必须先进行更改。如果您需要进一步的帮助,请告诉我,届时我会修改我的答案。
  • 我在 public static IntelOrNo ai = new IntelOrNo(this) 行上收到“Keyword 'this' is not valid in a static property, static method, or static field initializer' 的编译错误跨度>
  • IntelOrNo ai 是静态的是否有特定原因?
  • 不——这正是 VS 在创建时设置它的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多