在类内部调用一个方法

4
我有两个表单(Form1和Form2)和一个类(Class1)。 Form1包含一个按钮(Button1),Form2包含一个RichTextBox(textBox1)。当我在Form1上按下Button1时,我希望调用方法(DoSomethingWithText)。但是我一直收到“NullReferenceException-对象引用未设置为对象实例”的错误。以下是代码示例:
Form1:
namespace Test1
{  
    public partial class Form1 : Form  
    {
        Form2 frm2;

        Class1 cl;

        public Form1()  
        { 
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            frm2 = new Form2(); 
            cl.DoSomethingWithText();
            frm2.Show()
        } 
   }  
}  

类1:

namespace Test1
{
      class Class1
      {
           Test1.Form2 f2;
           public void DoSomethingWithText()
           {
                f2.richTextBox1.Text = "Blah blah blah";
           }
      }
}

如何在类内调用此方法?非常感谢你的帮助。
5个回答

11

你需要实例化 c1f2。尝试这样做:

public partial class Form1 : Form  
{
    Form2 frm2;
    Class1 cl;
    public Form1()  
    {  
        c1 = new Class1();
        InitializeComponent();  
    }
    private void button1_Click(object sender, EventArgs e)
    {
      frm2 = new Form2();
      cl.DoSomethingWithText(frm2);
      frm2.Show();
    } 
}

class Class1
{

    public void DoSomethingWithText(Test1.Form2 form)
    {
        form.richTextBox1.Text = "Blah blah blah";
    }
}

更新

正如Keith所指出的,因为您正在实例化Form2的新版本,所以富文本框将永远不会显示blah blah blah代码。 我已更新示例以修复此问题。


这将编译,但不会完全按预期工作 - Class1实例化了自己的Form2副本,因此显示的那个不会有DoSomethingWithText的结果。要修复,可以通过某种方式将frm2传递给c1,或者调用cl.f2.Show()。 - Keith
原始问题是如何摆脱NullReferenceException,然而看到问题得到解决总是比看到问题得到回答更好! - Hooloovoo
由于Class1不保存任何状态,因此DoSomethingWithText方法可以被定义为静态的。这样你就不需要实例化它(或保留对它的引用),而是可以直接调用Class1.DoSomethingWithText(frm2) - Fredrik Mörk

3

在使用Class1之前,您还没有实例化它的实例。

您需要执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
    c1 = new Class1();
    frm2 = new Form2();
    cl.DoSomethingWithText(frm2);
    frm2.Show();
} 

我还添加了frm2的传递到DoSomethingWithText方法中,以便它可以使用(否则,您将在该类中获得另一个类似的异常,因为f2尚未实例化)。


1
要么先实例化(参见@Ray Booysen的答案),要么将其转换为静态方法:
class Class1
{
   public static void DoSomethingWithText( Test1.Form2 f2 )
   {
      f2.richTextBox1.Text = "Blah blah blah";
   }
}

然后:

 frm2 = new Form2();
 Class1.DoSomethingWithText( frm2 );
 frm2.Show();

1

你从来没有初始化cl(或者f2)。


0

你需要将DoSomethingWithText声明为静态类,或者实例化对Class1的引用。

public static void DoSomethingWithText()           
  {                
    //Code goes here;           
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接