Управление ссылками на одну форму из другой формы - PullRequest
2 голосов
/ 17 декабря 2010

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

Обычно я просто выполняю Form.Control.Property, но это не работает, и каждый пример, который я нашел через Google, не работает для меня.

Это просто кажется слишком сложным с публичными классами и т. Д.

Есть ли более простой способ сделать это? Я готов добавить полотенце и просто использовать глобальную переменную.

У меня есть форма, содержащая элемент управления, на который я хочу сослаться, frmGenerate, в котором есть текстовое поле txtCustomerNo.

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

frmCustomers.ShowDialog()

Это должно быть что-то простое, что я просто не понимаю.

Ответы [ 8 ]

4 голосов
/ 17 декабря 2010

В форме с элементом управления вы хотите сослаться на:

Public Property CustomerNo() As TextBox
    Get
        Return txtCustomerNo
    End Get
    Set(ByVal Value As TextBox)
        txtCustomerNo = Value
    End Set
End Property

В форме вы хотите сослаться на элемент управления:

Dim CustomerNo as string = _sourceForm.CustomerNo.Text

Это плохой дизайн, но это самый простой метод - и он должен заставить вас идти по нему.

Если вас интересует только значение, введенное в текстовое поле, то лучше может быть следующее:

Public ReadOnly Property CustomerNo() As String
    Get
        Return txtCustomerNo.Text
    End Get
End Property

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

Private _sourceForm as frmGenerate

Public Property SourceForm() As frmGenerate 
    Get
        Return _sourceForm
    End Get
    Set(ByVal Value As frmGenerate)
        _sourceForm = Value
    End Set
End Property

Теперь вы можете выполнять следующие действия при создании и запуске вашей второй формы:

Dim customersForm as new frmCustomers
customersForm.SourceForm = Me
customersForm.Show()    

EDIT: Я создал пример проекта для вас здесь:

http://www.yourfilelink.com/get.php?fid=595015

1 голос
/ 03 марта 2016
My.Forms.frmGenerate.txtCustomerNo.Text
1 голос
/ 26 марта 2012

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

Хитростьздесь нужно убедиться, что код класса использует аргумент «ByRef» в вызываемом классе, иначе это не будет работать.В памяти вы ссылаетесь на тот же элемент управления, не создавая для него новых свойств, и это уменьшает ползучесть кода.

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

ВФорма, позвоните своему классу и передать ему кнопку (или любой другой элемент управления):

' new the class your calling
Dim CallClass As New ProgramCall
' pass the control as a by reference argument
CallClass .SetUpTheCall("HOURLY", btnSendToBank)  

Затем в вашем классе:

Public Sub SetUpTheCall(ByVal ParmToPass As String, ByRef btnSendToBank As Button)

' your class logic goes here...

' disable the send button on the calling form
btnSendToBank.Enabled = False

' change the button text on the calling form
btnSendToBank.text = "Disabled"
1 голос
/ 17 декабря 2010

Сделать приватное поле. Щелкните правой кнопкой мыши «Refactor», выберите «Encapsulate Field». Это автоматически создаст публичное свойство для поля.

Другой подход - перегрузить открытый конструктор.

public CustomersForm(string property1, string property2...)
{
     //Get the properties and do what is necessary.
}

//Parent Form

CustomersForm frmCustomers = new CustomersForm(property1, property2..);

Также отправка полного контроля в другую форму не является хорошей стратегией. Делитесь только теми полями, которые необходимы через общедоступные свойства / конструкторы.

1 голос
/ 17 декабря 2010

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

Иногда полезно создать отдельное открытое свойство или метод. И пусть метод позаботится о деталях. Например, если вы просто хотите иметь возможность доступа к тексту, вы можете создать свойство примерно так (в C #).

public string CustomerNo
{
    get
    {
        return txtCustomerNo.Text;
    }
    set
    {
        txtCustomerNo.Text = value;
    }
}
1 голос
/ 17 декабря 2010

Необходимо убедиться, что добавленные вами свойства public, иначе они не будут доступны другим классам.

0 голосов
/ 28 сентября 2015

Я сохраняю имя человека, вошедшего в текстовое поле, в следующей форме после того, как они войдут в систему следующим образом.Моя кнопка входа в систему содержит последние строки: Me.Hide () (Not Me.Close ()) Admin.Show () End

Когда пользователь вводит правильное имя пользователя и пароль, он скрывает форму входа и открываетследующая страница, Admin.vb

В Admin_Load страницы Admin.vb в качестве последних строк, которые я поставил:

Dim, зарегистрированный как String logged = Login.txtUser.Text).'Close hidden login.vb' End Sub

Итак, пользователь нажимает кнопку входа и скрывает форму входа со значением, которое я хочу, в текстовом поле txtUser.Затем он открывает страницу администратора.Событие загрузки страницы администратора получает мое значение со скрытой страницы входа в текстовое поле txtUser и помещает его в параметр «logged».Как только значение получено, оно закрывает страницу входа и покидает подпрограмму.Все это происходит в мгновение ока!Теперь везде, где я хочу использовать имя человека, который вошел в систему, как в текстовом поле, я просто использую «logged».

txtchangesby.Text = logged

Очень просто и работает.

0 голосов
/ 21 декабря 2010

Хотя вы можете создать свойство во второй форме, которое будет возвращать необходимые данные, вы также можете легко изменить свойство Модификатор этого элемента управления.По умолчанию модификаторы элементов управления являются частными и, следовательно, не доступны ни для чего, кроме текущей формы.Нажмите на элемент управления и найдите свойство Modifier.Установите для него значение Public, и вы сможете получить к нему доступ вне формы, например:

Dim f As New SecondForm
f.FirstNameTextBox.Text = "Bob"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...