这应该非常简单 - 不确定问题是什么。
我有一个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#中引用它吗?
谢谢。
答案 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所说,使用更好的名字,虽然我怀疑你刚才在你的问题中给出了例子名称。