This is generally the path to spaghetti code. Your visual designer makes those controls private for good reason. In general you should be storing that information in a business object, not just in the UI layer, and binding to it (either formally using the .Net data binding mechanism, or informally by setting properties in initialisation), not binding between two forms.
I recommend you read around data binding. Even if you choose not to use it for your project right now, it will come in useful in the future, and you will understand the issues much better.
One exception is a modal dialog, for example an options form or similar. In that case, the properties cannot change while it is active, and you can set them in the constructor and read them after dismissal. For example:
class Form1 {
void OnSomeMenuItemClicked(MyOptionsClass options){
OptionsForm optionsForm = new OptionsForm(options);
if(DialogResult.OK == optionsForm.ShowDialog(this))
optionsForm.SaveTo(options);
}
}
MyOptionsClass is just a data class and the OptionsForm reads and writes to it in its constructor (or a Read method) and SaveTo.
Two modeless windows interacting with the same data should
not directly set each other's controls. That way lies madness. For that scenario, .Net's data binding mechanism is almost certainly the right answer.
class Form1 {
void OnSomeOtherMenuItemClicked(){
Form2 form2 = new Form2(dataSource);
form2.Show(this);
}
class Form2 {
Form2(object dataSource){
this.CoolTextField.DataBindings.Add('Text', dataSource, 'CoolProperty');
}
dataSource is either your business object directly, or a binding class that covers it so that the properties you need for data binding are set up correctly.