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

时间:2011-05-10 22:14:27

标签: 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#中引用它吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

我强烈建议通过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,而不是将其用作实例变量。

答案 1 :(得分: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所说,使用更好的名字,虽然我怀疑你刚才在你的问题中给出了例子名称。