从另一个类访问表单控件

时间:2012-10-19 22:42:30

标签: c#

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

我只是使用

textBox1.Enabled = true;

但现在我有一个名为class1.cs的分离类

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

{注意}我没有尝试任何代码,因为我完全不知道这样做。

11 个答案:

答案 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;
        }
}
  • 错误的设置会将您的文本框初始化为禁用状态
  • 如果要默认启用,请将textBox1Enabled设置为true。
  • 如果您有其他逻辑来启用/禁用文本框,只需相应地修改textBox1Enabled的值即可。

答案 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撰写:)