2016-09-02 4 views
0

Немного фона в моем проекте: Я делаю многоформатное приложение, состоящее из 1 основной формы и 6 дочерних форм, которые можно вызывать из основной формы, но может быть активна только одна дочерняя форма вовремя. Эти дочерние формы имеют определенные части кода, которые я не хочу копировать. Чтобы решить эту проблему, у меня есть код в том же пространстве имен, в котором содержится незаписанный код. Этот файл кода, однако, нуждается в доступе к определенным свойствам текущей активной дочерней формы. Мой поиск сводится к использованию интерфейса для извлечения необходимой информации из активной дочерней формы.Общение между классами

Мой код в настоящее время ищет, как это:

Интерфейс:

public interface Interface1 
{ 
    TabControl tabControl_Buizen_ 
    { 
     get; 
    } 
    TabPage tabPage_plus_ 
    { 
     get; 
    } 
} 

Childform:

public partial class Childform : Form, Interface1 
{ 
    Interface1 dummy; 
    public TabControl tabControl_Buizen_ 
    { 
     get { return this.tabControl_Buizen; } 
    } 
    public TabPage tabPage_plus_ 
    { 
     get { return this.tabPage_plus; } 
    } 
    Methods_newTabPage methods = new Methods_newTabPage(dummy); 
} 

CodeFile:

public class Methods_newTabPage 
{ 
    private readonly Interface1 form; 
    public Methods_newTabPage(Interface1 formInterface) 
    { 
     this.form = formInterface; 
    } 
} 

Как вы можете видеть, я использую Methods_newTabPage methods = new Methods_newTabPage(dummy);, чтобы иметь возможность вызывать методы в моем кодовом файле, но файл кода требует передачи интерфейса (который я заполнил как «фиктивный»). Это, однако, вызывает ошибку «Инициализатор поля не может ссылаться на нестатические поля, метод или свойство Childform.dummy».

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

+1

Я не уверен, если я понимаю, что вы пытаясь достичь, но я думаю, вам может понадобиться шаблон MVC-designpattern: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller – Natrium

+1

@Natrium для приложений Windows [Model-view -view-model (MVVM)] (https: //en.wikipedia ,org/wiki/Model% E2% 80% 93view% E2% 80% 93viewmodel) более подходит –

+2

Разрушительные подходы (mvc или mvvm, вероятно, вынуждают вас переписать всю вашу программу и, вероятно, не в winforms); вы можете попытаться определить базовый класс/класс управления, внутри которого вы создаете общие методы. Затем вы делаете все дочерние наследуемые из этой базовой формы. – sam

ответ

0

Ошибка легко исправить: просто сделайте dummy статическим.

static Interface1 dummy; 

Однако, я не думаю, что это вам очень поможет. Почему вы передаете это dummy до Methods_newTabPage в любом случае? Это приведет к NullReferenceExceptions внутри файла кода, потому что dummy никогда не инициализировался ничем.

Не хотите ли вы передать this, то есть текущий экземпляр Childform?

Но вы не можете просто обмениваться dummy с this так:

// Compiler error "Keyword 'this' is not available in the current context". 
Methods_newTabPage methods = new Methods_newTabPage(this); 

Вместо этого вы должны добавить конструктор, который создает Methods_newTabPage:

public partial class Childform : Form, Interface1 
{ 
    private Methods_newTabPage methods; 

    public Childform() 
    { 
     methods = new Methods_newTabPage(this); 
    } 

    public TabControl tabControl_Buizen_ { get { return this.tabControl_Buizen; } } 

    public TabPage tabPage_plus_ { get { return this.tabPage_plus; } } 
} 
+0

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

0

Попробуйте добавить конструктор, который инициализирует поле methods.

Также я не вижу, как это манекен имеет смысл. Вместо этого инициализируйте методы с помощью methods = new Methods_newTabPage(this); в конструкторе.

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