【问题标题】:Change value of control on a form from class (C#)从类(C#)更改窗体上的控件值
【发布时间】:2011-05-11 06:37:46
【问题描述】:

这应该很简单——不知道问题出在哪里。

我有一个 C# 类 (Public.cs) 和一个 Windows 窗体 (Form1.cs)。通过Public.cs 中的一个函数,我想获取Form1 上某个控件的值(无需使用对象参数)。

// This code appears in Public.cs
public string MyFunction(int num_val)
{
  if (chk_num.checked == true)
  {
     // Something here...
  }
}

问题是我的班级在我的表单上找不到控件。有什么我必须在 C# 中引用它的方法吗?

谢谢。

【问题讨论】:

    标签: c# class forms checkbox


    【解决方案1】:

    我强烈建议通过 Form1 上的特定属性(可能使用更有意义的名称)公开 Checked 属性。这将有助于向调用者隐藏 Form1 的实现细节(即控制结构),而只公开其他消费者完成工作所需的逻辑

    例如:

    public bool IsNumberRequested
    {
        get { return chk_num.Checked; }
    }
    

    或者,如果您仍然真的想直接访问该控件,您可以从设计器中选择该控件并将其 Modifier 属性更改为 public(或其他),使您可以使用您的代码访问该控件对象原来写在上面。

    编辑:(基于评论的回应)

    Public.cs 仍需要对 Form1 的引用,然后将调用该对象的 IsNumberRequested 属性。

    // Public.cs
    public class Public
    {
        private Form1 _ui;
    
        public Public(Form1 ui) { _ui = ui };
    
        public string MyFunction(int num_val)
        {
             if (_ui.IsNumberRequested)
             {
                  // Stuff
             }
             // Else, default Stuff
        }
    }
    

    或者,您也可以将表单作为参数传递给MyFunction,而不是将其用作实例变量。

    【讨论】:

    • 请问,您为什么强烈建议使用第一种方法?另外,您是否建议不要使用“ if (chk_num.checked == true)” 我应该使用 if isNumberRequested = true" ?
    • 帮助向调用者隐藏 Form1 的实现细节(即控制结构),而只公开其他消费者完成工作所需的逻辑。
    【解决方案2】:

    我会反过来设置

    public class Public
    {   
        public bool CheckNumber {get;set;}
    
        public string MyFunction(int val)
        {
            if(CheckNumber)
            {
                //do that thing
            }
    
            return ...
        }
    }
    
    public partial class Form1 : Form
    {
        Public myinstance = new Public();
        public Form1()
        {
            InitializeComponent();
        }
    
        private void CheckBoxChanged(object sender, EventArgs e)
        {
             myinstance.CheckNumber = chk_num.checked;
        }
    }    
    

    您需要将CheckBoxChanged 分配给复选框的OnChanged 事件处理程序(我假设它是chk_num

    这样你的班级Public 就不会依赖于它不应该依赖的表单。

    正如 Reddog 所说,使用更好的名称,尽管我有一半怀疑您刚刚在问题中给出了示例名称​​。

    【讨论】:

    • 好点!是的,我想这真的取决于“公众”在这一切中的角色以及它是否应该知道 UI(即它是 UI“控制器”)还是不应该知道 UI (即我通常所说的 UI“服务”)。
    • 当您开始使用控件绑定来共享该地点周围的“状态”时,您的答案会更加合适。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多