如何使我的Form Control变量不能用于Form类以外的类?

时间:2015-08-28 03:32:47

标签: c# winforms

例如,在创建一个新的Windows窗体项目后,我有一个名为Form1.cs的类,从该窗体我可以简单地开始键入窗体控件的名称,它将自动填充窗体控件变量名称,我能够在课堂上使用它们。但是,我还有其他类需要能够访问这些表单控件变量,但它们无法访问。

4 个答案:

答案 0 :(得分:2)

如果要在其他程序集中使用它们,则将它们公开;如果要在同一项目中使用它们,则将其公开。将它们设置为静态意味着您不必将Form1传递到其他类中。

示例...假设您的Form1有一个字符串,其中包含您在标题栏中显示的文本。使其内部静态,如下所示:

internal static readonly string MsgBox_Title = " Best Application Evar!";

允许您从其他类访问它:

Form1.MsgBox_Title

它不必是只读的;这只是我从旧应用程序中提取的一个例子......

如果您不想要静态变量,则必须传入Form1的实例。

public class SomeClass
{
    private Form1 m_Form1;

    public SomeClass(Form1 form1)
    {
         m_Form1 = form1;
    }

    private void someMethod()
    {
       string localValue = m_Form1.SomeMemberStringVariable;
    }
}

这是一个非常人为的例子,但希望你能得到这个想法。

如果要从Form1实例化的类中调用Refresh方法,可以使用子类中的事件来通知Form1。

示例:

此Form1有一个按钮,用于显示辅助表单。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnShowPopup_Click(object sender, EventArgs e)
    {
        PopupForm f = new PopupForm();
        f.CallRefreshHandler += PopupForm_CallRefreshHandler;

        f.ShowDialog();
    }

    private void PopupForm_CallRefreshHandler(object sender, EventArgs e)
    {
        Refresh();
    }
}

辅助表单" PopupForm"有一个按钮,用于引发Form1订阅的事件,并让Form1知道调用Refresh。

public partial class PopupForm : Form
{
    public event EventHandler CallRefreshHandler;

    public PopupForm()
    {
        InitializeComponent();
    }

    private void btnRaiseEvent_Click(object sender, EventArgs e)
    {
        EventHandler handler = CallRefreshHandler;

        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

希望这有帮助。

答案 1 :(得分:1)

创建该类的对象&开始使用像这样的变量

{{1}}

答案 2 :(得分:1)

在表单中定义公共属性。

public string MyProp { get; set; }

Form1 frm = new Form1();
frm.MyProp = "Value";

或者将属性定义为static,以避免必须实例化Form1:

public static string MyProp { get; set; }

Form1.MyProp = "Value";

答案 3 :(得分:1)

我最近遇到过这个问题。我在一个单独的类中保留了一些方法。在我的情况下,也许不是一个好的设计决定,我还不确定。这些方法有时需要与主Form1中的控件进行通信。例如,要写入textBox1。

结果很简单。只需编写方法签名以包含TextBox实例。例如,您将方法中的textBox1传递给方法,并将其称为tb。然后,当您调用该方法时(即使它在另一个类中),您将tb.Text属性设置为您喜欢的任何属性,它将显示在textBox1上。

当您认为控件只是一种特殊的对象时,这是有道理的,在表单中以图形方式表示。当您将它作为参数传递给另一个类或同一个类中的方法时,实际上是在传递引用。因此,在方法调用中将文本写入其中会将文本写入原始控件。