Как я могу использовать метод из класса, созданного в другой форме?

#c# #.net #winforms #forms #reference

#c# #.net #winforms #формы #ссылка

Вопрос:

У меня есть класс, созданный в Form1 , и я хочу вызвать его Form2 , это возможно?

Например:

 public TheClass thClass; //member from Form1

/* ... */ 

public void foo() { 
       thClass = new TheClass(...);
} 
 

Форма 2:

 public void baa() { 
        Form1 form1 = new Form1();
        form1.thClass.MethodName( .. ) ;
}
 

Я получаю следующую ошибку при вызове .baa() метода в Form2 :

 Object reference not set to an instance of an object.
 

Каков наилучший способ сделать это? ref ?
Я хочу, чтобы это не создавало экземпляр thClass снова.

Надеюсь, это понятно. Заранее спасибо.

Ответ №1:

Вы получаете это исключение, потому thClass null что в вашем примере вы должны вызвать foo() перед использованием thClass .

Поля ссылочного типа не представляют собой ничего особенного — к ним можно получить доступ, как к любому другому общедоступному полю класса (и Form1 является классом). В общем случае вы захотите вместо этого использовать свойство и избегать открытых полей, поскольку любое их изменение приведет к нарушению существующих потребителей — свойство, которое может быть установлено только классом-владельцем, который вы могли бы выразить как

 public TheClass SomeClass {get; private set;}
 

Комментарии:

1. Я получаю ту же ошибку .. .foo() метод вызывается в Form1 этом недостаточно, чтобы я мог вызвать .baa() Form2 ?

2. вы получили это в обратном порядке в своем примере — вы должны сначала вызвать foo() , затем вы можете вызвать form1.thClass.MethodName()

Ответ №2:

Лучшим способом сделать это может быть передача экземпляра класса в Form1 конструктору Form2.

 // Code from Form 1
public partial class Form1 : Form
{
    private TheClass thClass;
    public Form1()
    {
        InitializeComponent();
    }
    public void foo()
    { 
        thClass = new TheClass(...);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2(thClass);
        objForm2.Show();
    }
}

// Code From Form 2
public partial class Form2 : Form
{
    private TheClass thClass;
    public Form2(TheClass thCls)
    {
        thClass = thCls;
        InitializeComponent();
    }

    private void baa(object sender, EventArgs e)
    {
        thClass.MethodName( .. );
    }
}
 

Ответ №3:

вы должны вызвать Foo() для инициализации «thClass»….

 public void baa() { 
    Form1 form1 = new Form1();
    form1.foo();
    form1.thClass.MethodName( .. ) ;
}
 

Комментарии:

1. .foo() вызывается в Form1

2. Я не вижу, где вызывается … объявляется… но не вызывается

Ответ №4:

поскольку вы инициализируете thClass в методе foo, вы просто вызываете метод перед использованием thClass

 public void baa() { 
        Form1 form1 = new Form1();
        form1.foo();
        form1.thClass.MethodName( .. ) ;
}
 

или вы можете инициализировать напрямую

 public void baa() { 
        Form1 form1 = new Form1();
        form1.thClass = new TheClass(...);
        form1.thClass.MethodName( .. ) ;
}