C# Данные DataGridView перемещаются в следующую ячейку после завершения редактирования - PullRequest
0 голосов
/ 05 августа 2020

Я сделал элемент управления для события CellEndEdit, чтобы предотвратить null или пустые значения. Когда пользователь редактирует ячейку и нажимает, например, на следующую ячейку и оставляет ее пустой, он выдает ошибку и устанавливает свойство CurrentCell для пустой ячейки. После того, как я редактирую пустую ячейку и нажимаю TAB, значение перемещается в следующую ячейку, а текущая ячейка перемещается к следующей ячейке. Я могу объяснить это запутанно, поэтому позвольте мне показать вам это видеозапись . У меня также есть событие CellClick для начала редактирования, когда я щелкаю ячейку.

Вот код:

private void notTakipPaneli_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (String.IsNullOrEmpty(notTakipPaneli[e.ColumnIndex, e.RowIndex].FormattedValue.ToString()))
    {
        MessageBox.Show("Lütfen hücreyi boş bırakmayınız.");

        notTakipPaneli.CurrentCell = notTakipPaneli[e.ColumnIndex, e.RowIndex];
        notTakipPaneli.BeginEdit(true);

        //for (int i = e.ColumnIndex + 1; i < notTakipPaneli.Rows[e.RowIndex].Cells.Count; i++)
        //    notTakipPaneli[i, e.RowIndex].Selected = false;

        return;
    }

    if (e.ColumnIndex == (notTakipPaneli.Rows[e.RowIndex].Cells.Count) - 2)
    {
        double ortalama = 0;

        byte vize = Convert.ToByte(notTakipPaneli.Rows[e.RowIndex].Cells[1].FormattedValue);
        byte final = Convert.ToByte(notTakipPaneli.Rows[e.RowIndex].Cells[(notTakipPaneli.Rows[e.RowIndex].Cells.Count) - 2].FormattedValue);
        byte araSinav = Convert.ToByte(notTakipPaneli.Rows[e.RowIndex].Cells["araSinav"].FormattedValue);

        if (araSinav == 0)
            ortalama = (vize * 0.4) + (final * 0.6);
        else
            ortalama = (vize * 0.2) + (araSinav * 0.2) + (final * 0.6);

        ortalama = Math.Round(ortalama, 2, MidpointRounding.AwayFromZero);

        notTakipPaneli.Rows[e.RowIndex].Cells["notOrtalamasi"].Value = ortalama;

    }

}

private void veriKaydet_Click(object sender, EventArgs e)
{
    for (int i = 0; i < notTakipPaneli.Rows.Count; i++)
    {
        for (int j = 0; j < notTakipPaneli.Columns.Count; j++)
        {

            if (String.IsNullOrEmpty(notTakipPaneli[j, i].FormattedValue.ToString()))
            {
                MessageBox.Show("Lütfen boş alan bırakmayınız",
                                "Not Takip Paneli",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                notTakipPaneli[j, i].Selected = true;
                return;
            }

        }
    }
}

private void yeniSatirEkle_Click(object sender, EventArgs e)
{
    notTakipPaneli.Rows.Add();
}

private void notTakipPaneli_CellClick(object sender, DataGridViewCellEventArgs e)
{
    notTakipPaneli.BeginEdit(true);
}

1 Ответ

0 голосов
/ 06 августа 2020

Возможно, вы можете попытаться обернуть этот код в блок BeginInvoke.

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (String.IsNullOrEmpty(dataGridView1[e.ColumnIndex, e.RowIndex].FormattedValue.ToString()))
    {
        MessageBox.Show("Lütfen hücreyi boş bırakmayınız.");

        this.BeginInvoke(new Action(() => {
            dataGridView1.CurrentCell = dataGridView1[e.ColumnIndex, e.RowIndex];
            dataGridView1.BeginEdit(true);
        }));

        return;
    }
}
...