13

我有一个 Windows 窗体应用程序,其中添加了一些控件到设计器中。当我想从 Form1.cs 中更改启用文本框的某些内容(LIKE)时,我只需使用:

textBox1.Enabled = true;

但现在我有一个名为 class1.cs 的单独类。

如何从静态函数 class1.cs 启用 textBox1?

注意:我没有尝试任何代码,因为我对此一无所知。

4

11 回答 11

19

编辑:很多编辑。

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;
    }
}
于 2012-10-19T22:45:16.957 回答
15

这只是另一种方法:

TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;
于 2016-08-11T13:44:11.590 回答
4

您可以将 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;
于 2012-10-19T22:50:12.280 回答
3

您可以让您的 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 ;
       }
于 2012-10-19T22:50:08.603 回答
3

您不应该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);
于 2012-10-19T22:50:20.563 回答
2

要访问/修改表单元素属性,只需将其写在您的外部类中。

Form1.ActiveForm.Controls["textBox1"].Enabled = true;

textBox1TextBox 的变量名在哪里。

这实际上做了什么:获取由字符串中的名称指定的活动 Form 对象的控件。

警告:活动表单是指当前打开并关注的表单。如果您在计算机上使用最小化的 WindowsForm 应用程序执行其他操作,Form1.ActiveForm则不会获取表单,而是会给出null,这可能会导致以后出错。当心!

于 2019-11-16T15:36:40.383 回答
1

在本例中,您有一个名为 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

于 2021-04-23T11:46:23.660 回答
0

我不得不在工作中这样做,并且没有发现这些答案中的任何一个与我最终做的事情相匹配,所以我展示了我是如何让它发挥作用的。

首先,在加载事件中初始化类的副本。

NameOfClass newNameofClass;

然后你想绑定到你的类(在加载事件中):

textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));

在您的班级中,执行以下操作:

private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
    get
        {
            return textBox1Enabled;
        }
        set
        {
            textBox1Enabled = value;
        }
}
  • false 设置会将您的文本框初始化为禁用
  • 如果要默认启用,请将 textBox1Enabled 设置为 true。
  • 如果您有其他逻辑来启用/禁用文本框,只需相应地修改 textBox1Enabled 的值。
于 2018-10-03T18:36:16.400 回答
0

根据@vr_driver 的回答,您可以这样做以避免其他容器(如组框、面板...

TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;
于 2020-10-16T19:35:10.017 回答
0

好简单:

创建要从中访问元素的表单对象的实例。

Form1 ui = new Form1();

现在将表单元素更改为“公共” - 就像在设计器代码中一样:

...
public System.Windows.Forms.TextBox textBox6;
...

现在您可以在代码中像这样访问它们:

ui.textBox6 ...
于 2021-03-25T21:18:47.540 回答
-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) 写的 :)

于 2014-12-01T08:33:46.623 回答