我有一个 Windows 窗体应用程序,其中添加了一些控件到设计器中。当我想从 Form1.cs 中更改启用文本框的某些内容(LIKE)时,我只需使用:
textBox1.Enabled = true;
但现在我有一个名为 class1.cs 的单独类。
如何从静态函数 class1.cs 启用 textBox1?
注意:我没有尝试任何代码,因为我对此一无所知。
我有一个 Windows 窗体应用程序,其中添加了一些控件到设计器中。当我想从 Form1.cs 中更改启用文本框的某些内容(LIKE)时,我只需使用:
textBox1.Enabled = true;
但现在我有一个名为 class1.cs 的单独类。
如何从静态函数 class1.cs 启用 textBox1?
注意:我没有尝试任何代码,因为我对此一无所知。
编辑:很多编辑。
public partial class Form1 : Form
{
// Static form. Null if no form created yet.
private static Form1 form = null;
private delegate void EnableDelegate(bool enable);
public Form1()
{
InitializeComponent();
form = this;
}
// Static method, call the non-static version if the form exist.
public static void EnableStaticTextBox(bool enable)
{
if (form != null)
form.EnableTextBox(enable);
}
private void EnableTextBox(bool enable)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new EnableDelegate(EnableTextBox), new object[] { enable });
return; // Important
}
// Set textBox
textBox1.Enabled = enable;
}
}
这只是另一种方法:
TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;
您可以将 Form 的实例传递给类
MyForm frm = new MyForm();
MyClass c = new MyClass(frm);
然后您的班级可以采用该实例并访问文本框
public class MyClass
{
public MyClass(MyForm f)
{
f.TextBox1.Enabled = false;
}
}
设计看起来不太好
最好在表单中调用类并根据返回的值操作文本框
//MyForm Class
MyClass c = new MyClass();
c.DoSomethings();
if(c.getResult() == requiredValue)
textBox1.enabled = true;
else
textBox1.enabled = false;
//MyForm Class ends here
更新
public class Class1
{
public static int SomeFunction()
{
int result = 1;
return result;
}
public static void SomeFunction(out int result)
{
result = 1;
}
}
用法
if(Class1.SomeFunction() == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
或者
int result = 0;
Class1.SomeFunction(out result);
if(result == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
您可以让您的 class1 有一个事件来启用文本框。
public class Class1
{
public event Action<object, EventArgs> subscribe ;
private void raiseEvent()
{
var handler = subscribe ;
if(handler!=null)
{
handler(this,EventArgs.Empty);//Raise the enable event.
}
}
}
让包含 TextBox 的类以某种方式订阅它。在 TextBox 包装类中
public class TextBoxWrapper
public void EnablePropertyNotification(object sender, EventArgs args)
{
TextBox1.Enabled = true ; //Enables textbox when event is raised.
}
public TextBoxWrapper()
{
class1Instance.subscribe+=EnablePropertyNotification ;
}
您不应该Form
从您的class1中真正更改 UI 控件,而是在class1中创建一个方法或属性来判断是否应该启用文本框。
例子:
// I changed the name class1 to MySettings
public class MySettings
{
public bool ShouldTextBoxBeEnabled()
{
// Do some logic here.
return true;
}
// More generic
public static bool SetTextBoxState(TextBox textBox)
{
// Do some logic here.
textBox.Enabled = true;
}
// Or static property (method if you like)
public static StaticShouldTextBoxBeEnabled { get { return true; } }
}
然后以您的形式:
MySettings settings = new MySettings();
textBox1.Enabled = settings.ShouldTextBoxBeEnabled();
// Or static way
textBox1.Enabled = MySettings.StaticShouldTextBoxBeEnabled;
// Or this way you can send in all textboxes you want to do the logic on.
MySettings.SetTextBoxState(textBox1);
要访问/修改表单元素属性,只需将其写在您的外部类中。
Form1.ActiveForm.Controls["textBox1"].Enabled = true;
textBox1
TextBox 的变量名在哪里。
这实际上做了什么:获取由字符串中的名称指定的活动 Form 对象的控件。
警告:活动表单是指当前打开并关注的表单。如果您在计算机上使用最小化的 WindowsForm 应用程序执行其他操作,Form1.ActiveForm
则不会获取表单,而是会给出null
,这可能会导致以后出错。当心!
在本例中,您有一个名为 Main.cs 的表单和一个名为 MyClass 的类:
在 MyClass 中(注意:我的 Form Class 的名称 = 'Main'):
Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();
在 (FormName).Designer.cs 所以在我的情况下 Main.designer.cs 将适当的控件从“私有”更改为“公共”:
public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;
这为我解决了。谢谢, Ensai Tankado
我不得不在工作中这样做,并且没有发现这些答案中的任何一个与我最终做的事情相匹配,所以我展示了我是如何让它发挥作用的。
首先,在加载事件中初始化类的副本。
NameOfClass newNameofClass;
然后你想绑定到你的类(在加载事件中):
textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));
在您的班级中,执行以下操作:
private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
get
{
return textBox1Enabled;
}
set
{
textBox1Enabled = value;
}
}
根据@vr_driver 的回答,您可以这样做以避免其他容器(如组框、面板...
TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;
好简单:
创建要从中访问元素的表单对象的实例。
Form1 ui = new Form1();
现在将表单元素更改为“公共” - 就像在设计器代码中一样:
...
public System.Windows.Forms.TextBox textBox6;
...
现在您可以在代码中像这样访问它们:
ui.textBox6 ...
这就是你应该做的:我在我的表单类中编写了下面的代码:
public static Form1 form = null;
private delegate void SetImageDelegate(Image image);
public Form1()
{
InitializeComponent();
form = this;
}
public static void SetStaticImage(Image image)
{
if (form != null)
form.pic1.Image = image;
}
private void setImage(Image img)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new SetImageDelegate(setImage), new object[] { img });
return; // Important
}
// Set textBox
pic1.Image = img;
}
并且下面的代码应该在另一个类中:
Form1 frm= Form1.form;
frm.pic1.Image = image;
请注意,我private static Form1 form = null;
改为public static Form1 form = null;
祝你好运……哈桑·埃斯坎达里 (Hassan Eskandari) 写的 :)