Событие Datagridview Combobox и Textbox не запускается при загрузке данных - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю приложение, в котором datagridview имеет один комбинированный список и несколько текстовых полей

В сетевом представлении, когда я выбираю вручную значение комбинированного списка данных, значение Текстовое поле заполняется

Но datagridview заполняется bindingsource, и значение datagridviewcombobox выбирается, но значение текстового поля пусто

Пример как показано ниже

Значение поля со списком, выбранное пользователем, текстовое поле Имя учетной записи заполнено enter image description here

Значение поля со списком, выбранное bindingsource (динамически), текстовое поле «Имя учетной записи» пусто

enter image description here

Ниже мой код

int journalID = 0;
public Add(int id = 0)
{
     BindControls();
     journalID = id;
}


  private async void BindControls()
  {
     try
     {               
            if (journalID > 0)
            {
                List<JournalAccountViewModel> list = await new JournalModel().GetDetailById(journalID);
                for (int i = 0; i <= list.Count - 1; i++)
                {
                    bindingSource1.Add(list[i]);
                }
            }
            else
            {
                bindingSource1.Add(new JournalAccountViewModel());
                bindingSource1.List.Clear();
            }
            dgvJournal.AutoGenerateColumns = false;
            dgvJournal.AllowUserToAddRows = true;
            dgvJournal.AutoSize = true;
            dgvJournal.DataSource = bindingSource1;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Rule", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }


   private void dgvJournal_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        try
        {
            if (dgvJournal.CurrentCell.ColumnIndex == dgvJournal.Columns[colCredit.Name].Index) //Desired Column
            {
                TextBox tb = e.Control as TextBox;
                if (tb != null)
                {
                    tb.KeyPress += new KeyPressEventHandler(txtNumeri_KeyPress);
                }
            }

            if (dgvJournal.CurrentCell.ColumnIndex == dgvJournal.Columns[ColDebit.Name].Index) //Desired Column
            {
                TextBox tb = e.Control as TextBox;
                if (tb != null)
                {
                    tb.KeyPress += new KeyPressEventHandler(txtNumeri_KeyPress);
                }
            }


            ComboBox combo = e.Control as ComboBox;
            if (combo != null)
            {
                combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
                combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Rule", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }


   private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            if (((ComboBox)sender).SelectedItem != null)
            {
                AccountViewModel account = (AccountViewModel)((ComboBox)sender).SelectedItem;
                var currentcell = dgvJournal.CurrentCellAddress;
                DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dgvJournal.Rows[currentcell.Y].Cells[ColAccountName.Name];
                cel.Value = account.Name;
            }
            else
            {
                ((ComboBox)sender).SelectedIndex = 0;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Rule", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

  private void txtNumeri_KeyPress(object sender, KeyPressEventArgs e)
    {
        try
        {
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
            {
                e.Handled = true;
            }

            // only allow one decimal point
            if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
            {
                e.Handled = true;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Rule", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Подскажите, пожалуйста, как заполнить текстовое поле, если значение поля со списком установлено программно.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018
    private void dgvJournal_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        if (e.ListChangedType == ListChangedType.Reset)
        {
            var a = (DataGridView)sender;
            var b = a.DataSource;
            var c = (BindingSource)b;
            var d = c.List;
            int sumDebit = 0, sumCredit = 0;
            int cnt = 0;
            foreach (JournalAccountViewModel account in d)
            {
                dgvJournal.Rows[cnt].Cells[ColAccountName.Name].Value = accountList.Where(acc => acc.ID == account.AccountID).FirstOrDefault().Name;
                enableCell(((DataGridViewCell)dgvJournal.Rows[cnt].Cells[ColDebit.Name]), (account.Debit > 0));
                enableCell(((DataGridViewCell)dgvJournal.Rows[cnt].Cells[colCredit.Name]), (account.Credit > 0));
                cnt++;
            }
        }
    }
0 голосов
/ 17 ноября 2018

Я бы создал CellValueChanged событие для этого DataGridView и скопировал бы функциональность из вашего ComboBox_SelectedIndexChanged события.Это избавит от необходимости устанавливать эти события в dgvJournal_EditingControlShowing , а также разрешит исходную проблему, поскольку она будет срабатывать при каждом изменении значения в поле AccountNumber .

    private void dgvJournal_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        int accountNumberColIndex = dgvJournal.Columns["AccountNumber"].Index;

        // Checking that this value is from the account number column
        if (e.ColumnIndex == accountNumberColIndex)
        {
            AccountViewModel account = (AccountViewModel) dgvJournal.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
            int accountNameColIndex = dgvJournal.Columns["AccountName"].Index;

            DataGridViewTextBoxCell accountNameCell = (DataGridViewTextBoxCell) dgvJournal.Rows[e.RowIndex].Cells[accountNameColIndex];
            accountNameCell.Value = account.Name;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...