База данных обновляется только после закрытия и открытия диалога - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть DataGridView внутри формы, которая отображает данные из базы данных каждый раз, когда я загружаю страницу следующим образом:

private void LoadList(string Input)
{
    fieldsDataGridView.DataSource = null;
    List<Field> fields = new List<Field>();
    fields = fieldsData.GetAllByTaskId(Input);
    List<FieldsDGViewModel> fdgvm = new List<FieldsDGViewModel>();
    foreach (var item in fields)
    {
        var f = new FieldsDGViewModel
        {
            Id = item.Id,
            Name = item.Name,
            Order = item.Order,
            IsPrint = item.IsPrint
        };
        fdgvm.Add(f);
    }
    fdgvm = fdgvm.OrderBy(x => x.Order).ToList();
    fieldsDataGridView.DataSource = fdgvm;
    fieldsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    fieldsDataGridView.Columns["Id"].Visible = false;
    fieldsDataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}

Когда я дважды щелкаю по записи в моем списке, открывается диалоговое окносодержит форму и загружает соответствующие данные из этой записи.Когда я сохраняю детали, диалоговое окно закрывается, и в классе, где находится мой DataGridView, есть эта функция FormClose, которая обновляет DataGridView.

private void FormClosed(object sender, FormClosedEventArgs e)
{
    RefreshDataGrid();
    RecursiveClearInputs(this.Controls);
    fieldIdInput.Text = "";
}

private void RefreshDataGrid()
{
    var selected = programInput.SelectedValue;
    if (selected != null)
    {
        var result = programsData.Get(selected.ToString());
        if (result != null)
        {
            programIdInput.Text = result.Id;
            LoadList(result.Id);
        }
    }
    if (selected == "-1")
    {
        RecursiveClearInputs(this.Controls);
        programIdInput.Text = "";
        fieldIdInput.Text = "";
        fieldsDataGridView.DataSource = null;
    }
    fieldsDataGridView.ClearSelection();
}

Однако у меня возникает эта проблема, когда единственный способ, которыммой DataGridView обновляется правильно, если я закрою основную форму, в которой я нахожусь, и снова открою ее.

Я отладил и смог получить некоторые результаты.

Изображение 1: Сразу после закрытия формы обновления.В списке полей только одна запись может иметь IsPrint = true.Однако изображение показывает, что оба значения верны.

enter image description here

Изображение 2: После закрытия и повторного открытия страницы, содержащей DataGridView, отображается правильный результат.Только 1 IsPrint = true.

enter image description here

Я пробовал много способов решить эту проблему, но я не уверен, почему она не обновляется должным образом.

Этокак открыть диалог

EditFields editFields = new EditFields(programIdInput.Text, fieldIdInput.Text, false);
editFields.FormClosed += new FormClosedEventHandler(FormClosed);
editFields.ShowDialog();

РЕДАКТИРОВАТЬ:

Я добавил проверку результатов диалога, но она все еще не обновляет представление таблицы данных должным образом.Может быть, проблема в теме?

dr = editFields.ShowDialog();
if (dr == DialogResult.OK)
{
    RefreshDataGrid();
    RecursiveClearInputs(this.Controls);
    fieldIdInput.Text = "";
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я просто предполагаю, как выглядит событие OnCklick там, где вы открываете диалог, но я думаю, что проблема заключается в том, что вы пытаетесь обновить форму Datagrid другой формы / потока.(что не будет работать)

Я предлагаю вам открыть диалоговую форму с помощью ShowDialog и обновить сетку после закрытия формы в самом событии onclick.Попробуйте заменить

RefreshDataGrid();

в вашем событии FormClosed на

DialogResult = DialogResult.OK;

Тогда вы сможете обработать перезагрузку сетки в вашем событии onclick следующим образом:

 EditFields editFields = new EditFields(programIdInput.Text, fieldIdInput.Text, false);

   if (editFields.ShowDialog(this) == DialogResult.OK)
   {
          RefreshDataGrid();
   }
   else
   {
     //it was canceled
   }
   editFields.Dispose();
0 голосов
/ 26 февраля 2019

Вам необходимо передать основную форму в форму сведений.
В форме сведений реализовать событие OnClosing или OnClosed и вызвать MainForm.LoadList().

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