2012-12-07 3 views
1

У меня есть родительская форма MDI, которая может открыть дочернюю форму под названием «Заказ». Формы заказов имеют кнопку, которая позволяет пользователю распечатать заказ. Форма заказа имеет переменный размер печати, определенные в начале:Настроить открытую переменную дочерней формы из родительской формы MDI в VB.NET

Public Class Order 

Public psize As String 

    Private Sub button_order_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles process_order.Click 
    ' Code to handle the order and then print, etc 

Теперь родительская форма имеет psize переменную, а, который установлен в значение по умолчанию «A4». Только тогда, когда кто-то нажимает на один из пунктов меню в полосе меню окна Материнского будет это произошло:

psize = "A6" 

По умолчанию, когда родительское окно открывает новую форму заказа, мне нужно, чтобы установить ребенок форма-х psize переменная для собственного psize значение. Что-то вроде этого:

Dim f As Form 
    f = New Order 
    f.MdiParent = Me 
    f.psize = Me.psize ' BUT THIS LINE DOESN'T WORK 
    f.Show() 

Получаем, что f.psize не является участником формы. Я знаю, что передача переменных из родителя и ребенка MDI и из него довольно распространена, но, несмотря на несколько вариантов, которые я видел здесь, он, похоже, не работает. Это неправильный подход?

+1

Каким образом это не работает? –

+0

Когда я набираю «f», я ожидаю, что «psize» должен появиться в параметрах, которые я могу выбрать, и введите f.psize ... но я получаю сообщение об ошибке «psize не является членом System ... Windows.Forms». Он работает, когда я говорю Order.psize. Но как я могу присвоить его значение в этом текущем экземпляре? – user961627

ответ

2

Причина, по которой свойство недоступно, связано с тем, что вы используете неправильный тип для переменной. База Form тип не определяет это свойство. Скорее, ваш производный Order типа делает. Вы могли бы сделать что-то вроде этого:

Dim f As Order 
f = New Order 
f.MdiParent = Me 
f.psize = Me.psize 
f.Show() 

UPDATE

Как вы сказали в комментариях ниже, что вам действительно нужно сделать, чтобы быть в состоянии разделить динамическую настройку между всеми вашими формами так, что вы можете изменить настройку в любое время и повлиять на все ваши формы, которые уже были отображены. Лучший способ сделать это, было бы создать новый класс, который хранит все ваши общие параметры, например:

Public Class Settings 
    Public PaperSize As String = "A6" 
End Class 

Как вы можете видеть, делая так, вы можете легко централизовать все ваши настройки по умолчанию в вашем класс настроек, что является дополнительным преимуществом. Затем вам нужно изменить общественную собственность в вашей Order формы нового Settings типа, например:

Public Class Order 
    Inherits Form 

    Public Settings As Settings 
End Class 

Затем вам необходимо создать общие параметры объект в форме Родитель MDI, а затем передать его это для каждого из ваших Order форм, как они созданы:

Pubic Class MyParentForm 
    Private _settings As New Settings() 

    Private Sub ShowNewOrderForm() 
     Dim f As New Order() 
     f.MdiParent = Me 
     f.Settings = _settings 
     f.Show() 
    End Sub 

    Private Sub ChangePaperSize(size As String) 
     _settings.PaperSize = size 
    End Sub 
End Class 

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

+0

Я пробовал это, кажется, идет гладко, потому что он не показывает никаких ошибок. Я разместил msgbox в событии загрузки формы заказа, чтобы отобразить текущий psize. Когда я запускаю, он отображает A4, как ожидалось. Но когда я на самом деле делаю изменения в psize родителя MDI, а затем загружаю новую форму заказа, ее psize не имеет значения ... ни A4, ни A6, просто пусто! Это код, который я использую для фактического изменения psize родителя: 'Me.psize =" A6 "' ... Очень просто, но не работает! – user961627

+1

Вы меняете его после того, как форма заказа уже отображается? –

+0

Хорошо, но да, есть проблема с открытыми формами заказа ... Я попробовал следующее, но снова f.psize вызывает ошибку: 'Для каждого f В Me.MdiChildren Если TypeOf (f) есть заказ, то f.psize = Me.psize End If Next ' Как я могу динамически переназначить переменную f для ввода «Order»? – user961627

2

Изменить это:

Dim f As Form 

фактической реализации вашей формы:

Dim f As Order 

или просто ярлык:

Dim f As New Order 
Смежные вопросы