Заполнение одной формы из другой не получает все значения из второй формы - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть две формы:
первая "FrmAddRecordOfNonComplianceQHSE" имеет в событии загрузки этот код

        private async void FrmAddRecordOfNonComplianceQHSE_Load(object sender, EventArgs e)
    {
        KeyPreview = true;
        txtCreationDate.EditValue = DateTime.Today;

        DataTable DDt = await qhse.GetLastQHSEOrderNumberRecordOfNonCompliance().ConfigureAwait(true);
        string RatingNumber = DDt.Rows[0][0].ToString();
        txtOrderNumber.Text = RatingNumber;

        cmbDetecteurStructure.Properties.DataSource = await qhse.GetEmployeesByDepartmentID(Program.FK_Department).ConfigureAwait(true);
        cmbDetecteurStructure.Properties.DisplayMember = "Nom et Prénom";
        cmbDetecteurStructure.Properties.ValueMember = "Matricule";

        cmbRelevantStructure.Properties.DataSource = await qhse.Get_Department().ConfigureAwait(true);
        cmbRelevantStructure.Properties.DisplayMember = "Département";
        cmbRelevantStructure.Properties.ValueMember = "ID_Department";
    }

, и у меня есть этот код также

    private void cmbRelevantStructure_Closed(object sender, ClosedEventArgs e)
    {
        BeginInvoke(new MethodInvoker(() => { cmbRelevantEmployee.EditValue = null; }));
    }

    private async void cmbRelevantEmployee_Enter(object sender, EventArgs e)
    {
        try
        {
            cmbRelevantEmployee.Properties.DataSource = await qhse.GetManagerByDepartmentID(Convert.ToInt32(cmbRelevantStructure.EditValue, CultureInfo.CurrentCulture)).ConfigureAwait(true);
            cmbRelevantEmployee.Properties.DisplayMember = "Nom et Prénom";
            cmbRelevantEmployee.Properties.ValueMember = "Matricule";
        }
        catch { }
    }

и о вторая форма "FrmRecordOfNonComplianceQHSE" У меня есть этот код

FrmAddRecordOfNonComplianceQHSE frmQHSE = new FrmAddRecordOfNonComplianceQHSE();

и на DoubleClick gridView1 у меня есть этот код

         private async void gridView1_DoubleClick(object sender, EventArgs e)
    {                      
                    //frmQHSE.cmbDetecteurStructure.Properties.DataSource = null;
                    frmQHSE.cmbDetecteurStructure.EditValue = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "FKDetecteur");
                    frmQHSE.txtCreationDate.EditValue = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "CreationDate");
                    frmQHSE.txtOrderNumber.Text = string.Empty;
                    frmQHSE.txtOrderNumber.Text = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "OrderNumber").ToString();
                    frmQHSE.cmbRelevantStructure.EditValue = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "RelevantDepartment");
                    frmQHSE.cmbRelevantEmployee.Enter += new EventHandler(cmbRelevantEmployee_Enter);
                    frmQHSE.cmbRelevantEmployee.EditValue = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "FKRelevant");

                    if (frmQHSE == null || frmQHSE.IsDisposed)
                        frmQHSE = new FrmAddRecordOfNonComplianceQHSE();
                    frmQHSE.ShowDialog();
    }

и у меня есть этот код также

private async void cmbRelevantEmployee_Enter(object sender, EventArgs e)
    {
        try
        {
            frmQHSE.cmbRelevantEmployee.Properties.DataSource = await qhse.GetManagerByDepartmentID(Convert.ToInt32(gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "RelevantDepartment"), CultureInfo.CurrentCulture)).ConfigureAwait(true);
            frmQHSE.cmbRelevantEmployee.Properties.DisplayMember = "Nom et Prénom";
            frmQHSE.cmbRelevantEmployee.Properties.ValueMember = "Matricule";
        }
        catch { }
    }

Теперь, когда я дважды щелкну строку gridView1, откроется первая форма, но элементы управления получат значения из события загрузки этой формы, а не значения gridView1 моей второй формы.
Как можно решить эту проблему?
Спасибо за авансовый.

1 Ответ

1 голос
/ 02 февраля 2020

Либо используйте привязку данных и присвойте объект DataSource , либо присвойте значения элементам управления, но не смешивайте оба подхода.

Я предполагаю, что GetManagerByDepartmentID теперь возвращает DataTable или что-то в этом роде, поскольку у вас есть отображаемые имена членов с пробелами. Вместо этого создайте классы данных. Это облегчает манипулирование данными. Примерно так:

public class Employee
{
    public string NomPrénom { get; set; }
    public int Matricule { get; set; }
    public string Département { get; set; }
    public int ID_Department { get; set; }
    ...
}

Теперь вы можете позволить GetManagerByDepartmentID вернуть Employee объект. Ваша форма привязывается к объекту Employee, а ваша сетка может привязываться к объекту Employee. Или, по крайней мере, вы можете создать и заполнить такой объект вручную и назначить его для DataSource первой формы.

private async void gridView1_DoubleClick(object sender, EventArgs e)
{                      
    var emp = new Employee {
        FKDetecteur = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "FKDetecteur"),
        CreationDate = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "CreationDate"),
        OrderNumber gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "OrderNumber").ToString(),
        ....
     };
     frmQHSE.EmployeeBindingSource.DataSource = emp;
     frmQHSE.ShowDialog();
}

Используйте BindingSource es в сочетании с источниками данных объекта на вашем сервере. Это позволяет вам установить DisplayMember s и ValueMember s в конструкторе форм.

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