2016-08-01 8 views
0

В настоящее время я пишу мастер (используя библиотеку MBG SimpleWizard). У меня есть несколько страниц. и как способ обмена данными между ними, они передаются классу out DBManip DBController. Мне нужно использовать этот DBController в методе, но вызов обрабатывается библиотекой, поэтому я не могу легко передать DBController ссылкой на метод. Как я могу передать переданную ссылку в свойство, которое метод может изменить, и сохранить ссылку.Выполнение справки, доступной для методов

Класс инициализации:

WizardHost host = new WizardHost(); 
    using (host) 
    { 
     host.Text = Migration.Properties.Resources.AppName; 
     host.ShowFirstButton = false; 
     host.ShowLastButton = false; 
     host.WizardCompleted += new WizardHost.WizardCompletedEventHandler(this.Host_WizardCompleted); 

     DBManip DBController; 

     host.WizardPages.Add(1, new Page1()); 
     host.WizardPages.Add(2, new Page2(out DBController)); 
     host.WizardPages.Add(3, new Page3(out DBController)); 
     host.WizardPages.Add(4, new Page4(out DBController)); 
     host.LoadWizard(); 
     host.ShowDialog(); 
    } 

Конструктор:

public Page2(out DBManip DBController) 
     { 
      this.InitializeComponent(); 
      this.label1.Text = Migration.Properties.Resources.ExportDirectoryMessage; 
      this.exportDirTextbox.Text = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     } 

Метод:

private bool SetExportDirectory() 
{ 
    string exportDirectory = this.exportDirTextbox.Text; 

    // If a path is given, check if it's valid 
    // and set the pathExists boolean 
    if (!Directory.Exists(exportDirectory)) 
    { 
     MessageBox.Show(Migration.Properties.Resources.InvalidPath); 
     return false; 
    } 

    // Initializing the object to manipulate the databases 
    exportDirectory = new DBManip(exportDirectory); 
    return true; 
} 

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

public bool PageValid 
{ 
    get { return SetExportDirectory(); } 
} 

Извините, если я пропустил что-то простое, я довольно новичок в C#

+0

Вы говорите, что вы хотите, чтобы все ваши классы Page (Page1, Page2 и т.д.), чтобы поделиться ссылкой на общий экземпляр 'DBManip', и вы хотите, чтобы' SetExportDirectory' что-то делал с этим экземпляром 'DBManip'? Какой класс является 'SetExportDirectory' членом? –

+0

К первому вопросу, да. Во-вторых, он является членом страницы, а также PageValid. (У страницы 1 нет ссылки, потому что она не нужна, но вы получаете идею). –

+0

Я могу только догадываться, для чего вы хотите использовать «DBManip», но я предоставил ответ, показывающий, как один экземпляр «DBManip» среди классов Page. –

ответ

0

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

Чтобы сделать это, вы обычно создавали экземпляр DBManip сначала перед созданием страниц и передавали его каждому конструктору, который этого хочет. Каждый из этих классов будет иметь свойство, в котором он хранит ссылку, чтобы использовать ее позже. Каждый класс должен будет объявить это свойство для себя, так как вы не можете легко дать им общий базовый класс.

Но вы создаете его позже. Поскольку вам нужны разные классы для обмена ссылками на объект, созданный после выхода их конструкторов, мы добавим обобщенный класс ссылок «reference», и все они будут ссылаться на него. Затем мы можем изменить его свойства, и все они будут иметь новые значения свойств в существующем экземпляре этого небольшого класса «handle».

Reference.cs

// Semantically, this is basically a pointer to a pointer, without the asterisks. 
public class Reference<T> 
{ 
    public Reference() { } 

    public Reference(T t) { Value = t; } 

    public T Value; 
} 

Main C#

WizardHost host = new WizardHost(); 
using (host) 
{ 
    host.Text = Migration.Properties.Resources.AppName; 
    host.ShowFirstButton = false; 
    host.ShowLastButton = false; 
    host.WizardCompleted += new WizardHost.WizardCompletedEventHandler(this.Host_WizardCompleted); 

    // ************************ 
    // Create shared "reference" instance 
    // ************************ 
    Reference<DBManip> dbControllerRef = new Reference<DBManip>(); 

    host.WizardPages.Add(1, new Page1()); 
    host.WizardPages.Add(2, new Page2(dbControllerRef)); 
    host.WizardPages.Add(3, new Page3(dbControllerRef)); 
    host.WizardPages.Add(4, new Page4(dbControllerRef)); 
    host.LoadWizard(); 
    host.ShowDialog(); 
} 

Page2.cs

// It's not an out parameter so don't make it one. 
public Page2(Reference<DBManip> dbControllerRef) 
{ 
    this.InitializeComponent(); 

    this.DBControllerRef = dbControllerRef; 

    this.label1.Text = 
     Migration.Properties.Resources.ExportDirectoryMessage; 
    this.exportDirTextbox.Text = 
     Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
} 

public Reference<DBManip> DBControllerRef { 
    get; private set; 
} 

private bool SetExportDirectory() 
{ 
    string exportDirectory = this.exportDirTextbox.Text; 

    // If a path is given, check if it's valid 
    // and set the pathExists boolean 
    if (!Directory.Exists(exportDirectory)) 
    { 
     MessageBox.Show(Migration.Properties.Resources.InvalidPath); 
     return false; 
    } 

    // Everybody has the same Refernece<DBManip> 
    this.DBControllerRef.Value = new DBManip(exportDirectory); 

    return true; 
} 
+0

Итак, чтобы подтвердить, если я установил один из параметров DBController на стр. 2, этот параметр будет доступен со страницы 3? Исходя из C++, неявный справочный материал C# может ввести в заблуждение. –

+0

Что касается того, для чего я использую контроллер, он выполняет операции с файловой системой. Он должен хранить каталог, указанный на стр. 2, а затем на стр. 3 он выполняет операции, основанные на каталоге, который он предоставил. –

+0

@AdrianSmith Право.Подумайте об этом как о указателе, который автоматически разыменован - или подумайте об этом как о параметре 'DBManip & DBController', за исключением, в отличие от ссылок на C++, после этого он будет повторно привязан к другому фактическому экземпляру. –

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

  • Нет связанных вопросов^_^