Как передать другой результат в родительскую форму, когда на дочерней форме нажимается «X»? - PullRequest
1 голос
/ 17 апреля 2020

Я пользуюсь C# только около недели, и я новичок в программировании в целом.

У меня есть две формы. В форме parent у меня есть две кнопки - Add и Edit . Эти кнопки открывают форму child , в которой также есть две кнопки - Save и Cancel .

При отмене нажимается на дочерняя форма, в коде есть переменная индикатора, которая помечена как истинная:

//Indicator on child form; setup in properties.
public bool frmCloseInd { get; set; }

Индикатор настроен на кнопку отмены, чтобы установить значение true при событии щелчка:

//Cancel Event on child form
private void but_DM_Cancel_Click(object sender, EventArgs e)
{
      frmCloseInd = true;
      Close();
}

Значение frmCloseInd передается обратно родительскому форме. Оператор IF выполняется, чтобы определить, какой код выполняется. Проблема - когда X нажимается, он все равно выполняет тот же код, как если бы он был сохранен. Как я могу передать true в frmCloseInd при нажатии X?

Я пытался создать событие закрытия, но оно срабатывает при закрытии () в кнопках сохранения и отмены.

Вот событие нажатия кнопки добавления на родительском форма:

        private void but_DM_Add_Click(object sender, EventArgs e)
        {
            //instance of child form is called
            frmDirectoryManagerAARecord frm = new frmDirectoryManagerAARecord();
            //Setting properties specific to add button
            frm.Text = "Add Contract";
            frm.ShowDialog(this);

            if (frm.frmCloseInd == true)
            {
                //indicates the user canceled out of the userform. No action performed.
            }
            else
            {
                if (frm.frmAnalytic_ID == 0 || frm.frmClient_ID == 0 || frm.frmProject_ID == 0)
                {
                    MessageBox.Show("Required values were missing. Analytic ID, Client ID and Project ID are required for entry.");
                }
                else
                {
                    MessageBox.Show(frm.frmAnalytic_ID + " " + frm.frmClient_ID + " " + frm.frmProject_ID + " " + frm.frmDescrip);
                    try
                    {
                        string database = "DB_NAME";
                        string query_insert = @"INSERT INTO [dbo].[TestTable] 
                                            (Analytic_ID,   Master_Client_ID,   Project_ID, Description, Active)
                                            VALUES(" + frm.frmAnalytic_ID + ", " + frm.frmClient_ID + ", " + frm.frmProject_ID + ", '" + frm.frmDescrip + "', 1)";
                        //calling instance of class ContractSearch to use method connectToDatabase
                        ContractSearch con = new ContractSearch();
                        con.connectToDatabase(database, query_insert);
                        //reloads gridview on parent form
                        Reload_gvDirectoryManager();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.Message);
                    }
                }
            }
        }

и код кнопки SAVE на форме child :

private void but_DM_Save_Click(object sender, EventArgs e)
        {
            try
            {
                frmAnalytic_ID = Convert.ToInt32(tbox_DM_Analytic_ID.Text);
                frmClient_ID = Convert.ToInt32(tbox_DM_Client_ID.Text);
                frmProject_ID = Convert.ToInt32(tbox_DM_Project_ID.Text);
                frmDescrip = tbox_DM_Descrip.Text;
                Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

1 Ответ

1 голос
/ 20 апреля 2020

Самый простой способ решить вашу проблему - установить начальное значение свойства frmCloseInd на true:

// Default value TRUE for this property indicates that by default we mean
// that the form will be closed using Cancel or X button. If user clicks
// Save button then we set this property to FALSE.
public bool frmCloseInd { get; set; } = true;

Также мы должны установить соответствующее значение для этого свойства в Save и Close обработчики событий (если у вас есть FormClose обработчик событий, то вы не должны изменять значение свойства frmCloseInd в нем):

private void but_DM_Cancel_Click(object sender, EventArgs e)
{
    frmCloseInd = true;
    Close();
}

private void but_DM_Save_Click(object sender, EventArgs e)
{
    try
    {
        frmAnalytic_ID = Convert.ToInt32(tbox_DM_Analytic_ID.Text);
        frmClient_ID = Convert.ToInt32(tbox_DM_Client_ID.Text);
        frmProject_ID = Convert.ToInt32(tbox_DM_Project_ID.Text);
        frmDescrip = tbox_DM_Descrip.Text;

        frmCloseInd = false;
        Close();
    }
    catch(Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }
}

В качестве примечания я хотел бы указать для реализации такой функциональности в WinForms лучше использовать Form.DialogResult .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...