I am creating a ‘department picker’ form that is going to serve as a modal popup form with many of my ‘primary’ forms of a Winforms application. Ideally the user is going to click on an icon next to a text box that will pop up the form, they will select the department they need, and when they click OK, the dialog will close and I will have the value selected for me to update the textbox with.
I’ve already done the route with passing the owner of the dialog box into the dialog form and having the OK button click event do the proper update, but this forces me to do a DirectCast to the form type and I can then only reuse the picker on the current form.
I have been able to use a ByRef variable in the constructor and successfully update a value, but it works only in the constructor. If I attempt to assign the ByRef value to some internal variable in the Department Picker class, I lose the reference aspect of it. This is my basic code attached to my form:
Public Class DeptPicker Private m_TargetResult As String Public Sub New(ByRef TargetResult As String) InitializeComponent() ' This works just fine, my 'parent' form has the reference value properly updated. TargetResult = 'Booyah!' ' Once I leave the constructor, m_TargetResult is a simple string value that won't update the parent m_TargetResult = TargetResult End Sub Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click DialogResult = Windows.Forms.DialogResult.OK ' I get no love here. m_TargetResult is just a string and doesn't push the value back to the referenced variable I want. m_TargetResult = 'That department I selected.' Me.Close() End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click DialogResult = Windows.Forms.DialogResult.Cancel Me.Close() End Sub End Class
Can somebody tell me what I’m missing here or a different approach to make this happen?
Note: Code sample is in VB.NET, but I’ll take any C# answers too. 8^D
In such cases, I usually either
You can also combine these methods, by making the result value a property in the dialog and creating a ShowDialog method that returns that property value, either as ByRef as you want or as a return value, depending on your needs.
I’ll add this as a usage instruction, for example (sorry, no VB over here, and you said C# is welcome):
In the dialog itself, just do this:
I didn’t use the new ShowDialog implementation in this sample though.