Ali Majed HA Ответов: 2

Как динамически привести родительскую форму в C#


У меня есть форма в C#, которая будет вызываться из некоторых других форм. Некоторые элементы управления, такие как текстовые поля, будут заполнены из вызываемой формы с помощью следующего кода:

if (mdiparent is ADDSickFiling)
{
    ADDSickFiling _ADDSickFiling = (ADDSickFiling)mdiparent;
    _ADDSickFiling.ReferenceAccountId = Convert.ToInt32(GridViewService.CurrentRow
            .Cells["AccountId"].Value.ToString());
    _ADDSickFiling.ReferenceAccountTextBox.Text = GridViewService.CurrentRow
            .Cells["AccountName"].Value.ToString();
}
else if (mdiparent is ReportCashierByAccOne)
{
    ReportCashierByAccOne _ReportCashierByAccOne 
            = (ReportCashierByAccOne)mdiparent;
    _ReportCashierByAccOne.CashierID = Convert.ToInt32(GridViewService.CurrentRow
            .Cells["AccountId"].Value.ToString());
    _ReportCashierByAccOne.CashierNameTextBox.Text = GridViewService.CurrentRow
            .Cells["AccountName"].Value.ToString();
}
else if (mdiparent is ReportDrugStoreBill)
{
    ReportDrugStoreBill _ReportDrugStoreBill = (ReportDrugStoreBill)mdiparent;
    _ReportDrugStoreBill.CashierID = Convert.ToInt32(GridViewService.CurrentRow
            .Cells["AccountId"].Value.ToString());
    _ReportDrugStoreBill.CashierNameTextBox.Text = GridViewService.CurrentRow
            .Cells["AccountName"].Value.ToString();
}


На основе родительской формы, которая вызвала эту форму, будет выполнен любой из этих трех блоков условий. Эти блоки имеют много общего кода. Как я могу свести эти коды в один блок кода? Как я могу динамически привести тип родительской формы к mdiparent и получить доступ к элементам управления родительской формы, как TextBox?

Что я уже пробовал:

Я уже пробовал этот код:
var parentForm = mdiparent.GetTypeof()


Но это кажется неправильным.

2 Ответов

Рейтинг:
6

OriginalGriff

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

Видеть здесь: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]


BillWoodruff

К сожалению, сейчас устаревшие модели приложений с MDI-интерфейсом сил воздействия на главном окне приложения в свойство MDIParent каждый MDIChildForm по.

OriginalGriff

Но это не значит, что вы должны им пользоваться! :смеяться:

Ali Majed HA

Большое спасибо за вашу помощь и вашу замечательную статью :)

OriginalGriff

Всегда пожалуйста!

Рейтинг:
17

Richard Deeming

Пусть родительские формы реализуют интерфейс:

public interface ISetAccountDetails
{
    int AccountId { set; }
    string AccountName { set; }
}

public class ADDSickFiling : Form, ISetAccountDetails
{
    ...
    int ISetAccountDetails.AccountId
    {
        set { ReferenceAccountId = value; }
    }
    
    string ISetAccountDetails.AccountName
    {
        set { ReferenceAccountTextBox.Text = value; }
    }
}

public class ReportCashierByAccOne : Form, ISetAccountDetails
{
    ...
    int ISetAccountDetails.AccountId
    {
        set { CashierID = value; }
    }
    
    string ISetAccountDetails.AccountName
    {
        set { CashierNameTextBox.Text = value; }
    }
}

public class ReportDrugStoreBill : Form, ISetAccountDetails
{
    ...
    int ISetAccountDetails.AccountId
    {
        set { CashierID = value; }
    }
    
    string ISetAccountDetails.AccountName
    {
        set { CashierNameTextBox.Text = value; }
    }
}
Затем используйте этот интерфейс для обновления родительского элемента:
if (mdiparent is ISetAccountDetails setAccount)
{
    setAccount.AccountId = Convert.ToInt32(GridViewService.CurrentRow.Cells["AccountId"].Value.ToString());
    setAccount.AccountName = GridViewService.CurrentRow.Cells["AccountName"].Value.ToString();
}
интерфейс - Справочник по C# | Microsoft Docs[^]


BillWoodruff

Интересно ! В этом случае, по-видимому, ОП использует архитектуру MDI feom позднего неолита.

Ali Majed HA

Спасибо за ваш ответ. Мне это приятно и понятно :)