2017-02-02 2 views
0

Я конвертирую приложение из VB.NET в C# в приложениях WinForms.Необработанное исключение типа «System.StackOverflowException» произошло в WTApp

Проблема возникла, когда я понял, что вы не можете получить доступ к другим формам непосредственно, как вы можете в VB.NET, например:

Public Class frmMain 
    Private Sub Preferences_Click(sender... 
      frmPreferences.Show()           
    End Sub 
End Class 

Так что я был смотреть онлайн и казалось, что я должен был объявить ссылку на форму, прежде чем я смогу изменить значения своих элементов управления. Итак:


У меня теперь есть две отдельные формы. Один названный frmPreferences, который выглядит, как это без дополнительных битов кода:

public partial class frmPreferences : Form 
    { 
     frmMain frmMain = new frmMain(); 
    } 


И другой, frmMain, просто объявляя другую форму:

public partial class frmMain : Form 
    { 
     frmPreferences frmPreferences = new frmPreferences(); 
    } 

Стек вызовов показывает:

WTAppCSharp.exe! WTAppCSharp.frmMain.frmMain() Строка 17 C#
WTAppCSharp.exe! WTAppCSharp.frmPreferences.frmPrefere NCES() Строка 38 C#
WTAppCSharp.exe! WTAppCSharp.frmMain.frmMain() Строка 17 C#
WTAppCSharp.exe! WTAppCSharp.frmPreferences.frmPreferences() Строка 38 C#
....

I «м просто не знаю, как правильно ссылаться на формы, или, что я делаю неправильно :(

Надежда кто-то может помочь :)

+0

удалить 'frmMain frmMain = новый frmMain()' 'от frmPreferences' конструктора – vmeln

ответ

1

проблема заключается в том, что вы создали бесконечный цикл. Ваши два конструктора ссылаются друг на друга. Вы можете удалить ссылку из frmPreferences или вообще избавиться от конструктора без параметров.

public frmMain() 
    { //this is all you need. 
     frmPreferences frmPreferences = new frmPreferences(); 
     frmPreferences.Show(); 
    } 

Это исправит его и появится форма настроек для вас. Я бы изменил все ваши имена переменных, чтобы НЕ быть тем же именем и случаем, что и класс, который они называют. Это будет иметь смысл при устранении неполадок, и вы можете начать получать ошибки от intellisense, говоря, что вы все равно не можете этого сделать.

Редактирование: Чтобы быть более конкретным, используя значения по умолчанию для своих свойств, вы вызываете конструктор без параметров, чтобы другой объект заполнил это свойство. Затем он называет свойство вашего первого объекта, которое затем вызывает второе, и так далее.

+0

Да, но мне нужно, чтобы получить доступ обе формы друг от друга так, удаляя: ' frmMain frmMain = новый frmMain() '' от frmPreferences' дал бы мне такие ошибки, как: «Ссылка на объект требуется для нестатического поля, метода или свойства« Control.Show ». Код VB наверху является всего лишь примером. У меня есть ссылка на код в каждой противоположной форме. – Lewis

+0

http://i.cubeupload.com/ePStoI.png – Lewis

+0

Хорошо, я понял. Благодаря! – Lewis

Смежные вопросы