我有一个Windows窗体应用程序,其中一些控件添加到设计器中。当我想要更改某些内容时(LIKE)从Form1.cs中启用一个文本框
我只是使用
textBox1.Enabled = true;
但现在我有一个名为class1.cs的分离类
如何从静态函数class1.cs启用textBox1?
{注意}我没有尝试任何代码,因为我完全不知道这样做。
答案 0 :(得分:10)
编辑:很多编辑。
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;
}
}
答案 1 :(得分:4)
这只是另一种方法:
TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;
答案 2 :(得分:3)
您可以将表单实例传递给类
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;
OR
int result = 0;
Class1.SomeFunction(out result);
if(result == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
答案 3 :(得分:2)
你可以让你的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 ;
}
答案 4 :(得分:2)
您不应该从 class1 中真正更改Form
中的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);
答案 5 :(得分:1)
在本例中,您有一个名为 Main.cs 的表单和一个名为 MyClass 的类:
在 MyClass 中(注意:我的表单类的名称 = 'Main'):
Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();
在 (FormName).Designer.cs 中,所以在我的情况下 Main.designer.cs 将适当的控件从“私有”更改为“公共”:
public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;
这为我解决了它。 谢谢,Ensai Tankado
答案 6 :(得分:0)
我必须在工作中执行此操作,但没有发现这些答案中的任何一个与我最终所做的事情相匹配,因此,我向我展示了我是如何做到的。
首先,在加载事件中初始化类的副本。
NameOfClass newNameofClass;
然后您想要绑定到您的类(在load事件中):
textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));
在您的课堂上,执行以下操作:
private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
get
{
return textBox1Enabled;
}
set
{
textBox1Enabled = value;
}
}
答案 7 :(得分:0)
要访问/修改表单元素属性,只需在您的外部类中编写即可。
Form1.ActiveForm.Controls["textBox1"].Enabled = true;
其中“ textBox1”是TextBox的变量名。
这实际上是做什么的:获取由字符串中的名称指定的活动Form对象的控件。
警告:活动表单是指当前处于打开状态并且重点关注的表单。如果您使用最小化的WindowsForm应用程序在计算机上执行其他操作,则Form1.ActiveForm将不会获得该窗体,而是会显示“ null”,这可能在以后导致错误。小心!
最诚挚的问候!
答案 8 :(得分:0)
根据@vr_driver的回答,您可以这样做,以避免其他容器出现问题,例如groupbox,panel ...
TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;
答案 9 :(得分:0)
非常简单:
创建要从中访问元素的表单对象的实例。
Form1 ui = new Form1();
现在将表单元素更改为“公共” - 就像设计器代码中的这样:
...
public System.Windows.Forms.TextBox textBox6;
...
现在您可以在代码中像这样访问它们:
ui.textBox6 ...
答案 10 :(得分:-1)
这是你应该做的: 我在表单类中编写了以下代码:
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撰写:)