Без реализации интерфейса есть два простых метода для ссылки на существующий класс Form из другого класса.
Передача ссылки на класс вызывающего (this
) в конструктор вызываемого объекта.:
Form2 form2 = new Form2(this);
form2.Show();
Использование свойства Владелец вызываемого абонента (Form2
).Владелец устанавливается с помощью методов Show (Владелец) или ShowDialog (Владелец) .this
является экземпляром вызывающего:
Form2 form2 = new Form2();
form2.Show(this);
Вы также можете иметь открытое свойство в вызываемом объекте (Form2
), используемое для установки текущего вызывающего (this
):
Form2 form2 = new Form2();
form2.MyCaller = this;
form2.Show();
Практически бесполезно, поскольку два предыдущих метода уже достигают того же результата, используя стандартные функции.Конечно, есть и другие средства, но в этом контексте они сильно излишни.
Здесь я использую свойство Owner
для доступа к экземпляру класса Form
, в котором был создан ваш Search
Форма класса.В этом примере используется открытый метод класса вызывающей стороны (ваш InvoiceForm
), который вызываемый абонент (ваша форма Search
) использует для передачи значений, выбранных пользователем.
Использование Form.Show(this)
также подразумевает, что показанная Форма будет в виде (не путать со свойством Parent
) с формой, которая показала ее и останется поверх нее.
Вы также можете использовать метод ShowDialog(this)
, если он предпочтителен в вашем случае.В этом случае форма будет отображаться как модальное диалоговое окно.
Я делаю два примера, используя этот открытый метод:
- Открытый метод с классомпараметр, который содержит все значения, которые можно установить в элементах управления
InvoiceForm
.Вероятно, это предпочтительный метод для передачи этих значений, поскольку его легче расширять и повторно использовать в различных контекстах. - Открытый метод со строковыми параметрами, соответствующими значениям TextBoxes для установки
Открытый метод с параметром класса :
Обратите внимание, что this.Owner is InvoiceForm frm
используется для идентификации текущего Owner
.
Класс UpdateMyControls
контейнер , используемый для передачи определенных значений.SearchForm
мог бы действовать по-другому, если владелец был другим.
Это несколько упрощено, но вы можете использовать этот выбор, чтобы повторно использовать SearchForm
с разными абонентами, получая разные результаты для каждого Owner
.
Примечание : класс, используемый для передачи значений / ссылок, может передаваться в конструкторе SearchForm
, возможно, с использованием известного контракта (интерфейса), который определяетценности и их типы.Слишком широк, чтобы описывать здесь, но вы должны рассмотреть эту возможность.
public partial class InvoiceForm : Form
{
public class UpdateMyControls
{
public string CodeText { get; set; }
public string NameText { get; set; }
public string BlahText { get; set; }
}
private void btnSearch_Click(object sender, EventArgs e)
{
SearchForm searcher = new SearchForm();
searcher.Show(this);
}
public void UpdateControls(UpdateMyControls allValues)
{
this.CodeTextBox.Text = allValues.CodeText;
this.NameTextBox.Text = allValues.NameText;
this.BlahTextBox.Text = allValues.BlahText;
}
}
public partial class SearchForm : Form
{
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (this.Owner is InvoiceForm frm)
{
InvoiceForm.UpdateMyControls updateClass = new InvoiceForm.UpdateMyControls();
updateClass.CodeText = sqldr[codecolumn].ToString();
updateClass.NameText = sqldr[Namecolumn].ToString();
updateClass.BlahText = sqldr[Blahcolumn].ToString();
frm.UpdateControls(updateClass);
this.Close();
}
}
}
}
Открытый метод с несколькими параметрами :
public partial class InvoiceForm : Form
{
private void btnSearch_Click(object sender, EventArgs e)
{
SearchForm searcher = new SearchForm();
searcher.Show(this);
}
public void UpdateControls(string Code, string Name, string Blah)
{
this.CodeTextBox.Text = Code;
this.NameTextBox.Text = Name;
this.BlahTextBox.Text = Blah;
}
}
public partial class SearchForm : Form
{
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
string CodeValue = sqldr[codecolumn].ToString()
string NameValue = sqldr[Namecolumn].Tostring
string BlahValue = sqldr[Blahcolumn].Tostring
if (this.Owner is InvoiceForm frm)
{
frm.UpdateControls(CodeValue, NameValue, BlahValue);
this.Close();
}
}
}
}