C# 从类(C)更改窗体上控件的值

C# 从类(C)更改窗体上控件的值,c#,class,forms,checkbox,C#,Class,Forms,Checkbox,这应该很简单,真的-不知道问题是什么 我有一个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类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中引用它吗


谢谢。

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

例如:

public bool IsNumberRequested
{
    get { return chk_num.Checked; }
}
或者,如果仍然希望直接访问该控件,可以从设计器中选择该控件并将其修改器属性更改为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,而不是将其作为实例变量使用。

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

例如:

public bool IsNumberRequested
{
    get { return chk_num.Checked; }
}
或者,如果仍然希望直接访问该控件,可以从设计器中选择该控件并将其修改器属性更改为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,而不是将其作为实例变量使用。

我将以另一种方式进行设置

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分配给我假设为chk_num的复选框的OnChanged事件处理程序

这样,您的类Public就不依赖于表单,而表单不应该依赖于表单


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

我会用另一种方式设置名称

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分配给我假设为chk_num的复选框的OnChanged事件处理程序

这样,您的类Public就不依赖于表单,而表单不应该依赖于表单


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

请问,您为什么强烈建议使用第一种方法?另外,您是否建议我不使用if chk_num.checked==true,而应该使用if isNumberRequested=true?来帮助隐藏实现细节,即表单1的控制结构,以防调用方看到,而只公开其他用户执行其工作所需的逻辑。请问,你为什么强烈建议采用第一种方法?另外,您是否建议我不使用if chk_num.checked==true,而应该使用if isNumberRequested=true?来帮助隐藏实现细节,即表单1的控制结构,以防调用方看到,而只公开其他使用者执行其工作所需的逻辑。这一点很好!对我想这真的取决于公众在所有这一切中的角色,以及它是否应该意识到UI,即它是UI控制器还是它不应该意识到UI,即我通常称之为UI服务。当你开始使用控件绑定来共享周围的状态时,你的答案更合适。这一点很好!是的,我想这真的取决于公众在所有这一切中的角色,以及它是否应该意识到UI,即它是UI控制器还是它不应该意识到UI,即我通常称之为UI服务。当你开始使用控件绑定来共享周围的状态时,你的答案更合适。