Повторное содержание форм MDIchild

Я конвертирую приложение Windows Forms из VB в C#.

Короче говоря, у меня есть метод в классе formLocation(), в который передается форма (срабатывает во время двойного щелчка), и форма может быть сброшена как MDIChild MainForm. По какой-то причине этот код VB не переводится на C#. Это вынуждает меня создать новый экземпляр MainForm, что не идеально, потому что дочерняя форма должна войти в текущий экземпляр MainForm. Вот код VB: В основном мне просто нужен эквивалент С#:

Public Sub contain(ByVal form As Form)
    With form
        .MdiParent = MainForm
    End With
End Sub

person Matt    schedule 19.02.2017    source источник
comment
Если ему нужно войти в экземпляр, то передайте экземпляр MainForm методу... Я не понимаю, в чем проблема. Также поэтому вам требуется создать новый экземпляр, потому что он не знает, что такое MainForm...   -  person zaggler    schedule 19.02.2017
comment
Чтобы отучиться от ужасной функции экземпляра по умолчанию в VB.NET, потребуется некоторое время. Самый простой обходной путь — form.MdiParent = Application.OpenForms[0];   -  person Hans Passant    schedule 19.02.2017


Ответы (1)


VB создает экземпляр формы по умолчанию, доступ к которому осуществляется с тем же именем, что и у класса формы, что исторически вызывало много путаницы - все во имя сохранения пары строк кода.

В свой класс MainForm вставьте следующее:

private static MainForm _DefaultInstance;
public static MainForm DefaultInstance
{
    get
    {
        if (_DefaultInstance == null)
            _DefaultInstance = new MainForm();

        return _DefaultInstance;
    }
}

Теперь измените свой код на:

form.MdiParent = MainForm.DefaultInstance;

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

Преобразовывая VB в C#, вы столкнетесь со многими другими случаями, когда благое намерение VB скрыть детали от программистов помешало базовому пониманию концепций программирования (таких как экземпляр и тип).

person Dave Doknjas    schedule 19.02.2017
comment
И да! Я сталкивался с бесконечными ситуациями, когда благие намерения В.Б. вызывали у меня головную боль. - person Matt; 19.02.2017
comment
Большое спасибо! Это многое объясняет! однако это не ошибка, но форма не возвращается обратно в mainForm. Двойной щелчок, когда его mdiparent = null не сбрасывает его обратно в основную форму - person Matt; 19.02.2017
comment
@Matt Это потому, что вам нужна ссылка на этот экземпляр основной формы, как сказано в моих комментариях выше. Создание нового не поможет, так как это не тот экземпляр, который вам нужен... - person zaggler; 20.02.2017
comment
@Zaggler - я вставил код, как вы сказали. Все еще не идет. - person Matt; 20.02.2017