Запуск события DataGridView CellValueChanged Немедленно для выполнения разделителя тысяч

Я прошу вас терпеливо прочитать мою историю для решения, казалось бы, простой проблемы,

Моя главная цель - сделать разделитель тысяч в datagridview. Это означает, что когда я набираю 12345, он становится равным 12 345, разница с другой задачей - делать это, когда пользователь печатает, а не когда он или она покидают ячейку,

Я не смог найти какой-либо метод в событиях datagridview, который запускается всякий раз, когда я добавляю цифру в ячейку, например, если целью является запись 12345 в feeColumn, его нужно запускать пять раз,

После многих исследований я наткнулся на этот код, но у него есть некоторые проблемы:

myGrid:

ItemName  Quantity  FeeColumn


Private void grdTrading_CurrentCellDirtyStateChanged(object sender, System.EventArgs e) 
{
    If (grdTrading.IsCurrentCellDirty )
    {
        grdTrading.CommitEdit(DataGridViewDataErrorContexts.Commit)

    }
}

Private void grdTrading_CellValueChanged(object sender , System.Windows.FormsDataGridViewCellEventArgs e)
{
   grdTrading.Columns[ColumnFee.Name].DefaultCellStyle.Format=(Decimal.Parse(grdTrading.Rows[0].Cells[ColumnFee.Name].Value.Tostring())).Tostring("#,##0")
}

Теперь, что не так?

  1. Когда это в первую очередь идет к grdTrading_CurrentCellDirtyStateChanged и сделать commitedit больше не позволяет помещать какие-либо данные в ячейку и удалять данные, пока пользователь меняет свою ячейку

  2. теперь вы предполагаете, что есть данные, они успешно запускаются и даже запускаются cellValueChanged как только я добавляю любую цифру в столбец сбора, я имею в виду 1, затем 12, затем 123, затем 1234, затем 12345, но все равно в моей сетке нет запятой, когда я печатаю,

Я действительно сыт по горло этой проблемой, любая помощь или любое другое решение приветствуется мне, приятель,

1 ответ

Так же, как Реза Агаи справедливо указал, идея состоит в том, чтобы справиться с DataGridView.EditingControlShowing событие. Его совет практиковаться на TextBox контроль на месте, и я вижу, что вы, как правило, идея из вашей ссылки в комментариях. Вам просто нужно подключить все это сейчас:

this.dataGridView1.EditingControlShowing += this.DataGridView1_EditingControlShowing;

private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (e.Control is TextBox)
    {
        TextBox tb = e.Control as TextBox;
        tb.TextChanged -= Tb_TextChanged;
        tb.TextChanged += Tb_TextChanged;
    }
}

Теперь вы можете справиться с TextBox.TextChanged событие аналогично тому, что вы пытались в другом вопросе. Ниже я продемонстрировал свою реализацию с некоторыми изменениями положения курсора выделения, более близкого к его предыдущему положению.

private void Tb_TextChanged(object sender, EventArgs e)
{
    TextBox tb = sender as TextBox;
    ulong value;
    string text = tb.Text.Replace(",", "");
    string old = tb.Text;

    if (ulong.TryParse(text, out value))
    {
        int start = tb.SelectionStart;
        tb.Text = string.Format("{0:n0}", value);
        tb.SelectionStart = Math.Max(0, start + tb.Text.Length - old.Length);

        if (tb.SelectionStart > 0 && tb.Text[tb.SelectionStart - 1] == ',')
        {
            tb.SelectionStart--;
        }
    }
}

Надеюсь это поможет.


Sidenote: Если это раздражает ваших пользователей (вполне правдоподобно, поскольку это ненормальное ожидаемое поведение - изменение пользовательского ввода во время редактирования в реальном времени), достаточно легко вернуться к:

private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    ulong value;

    if (ulong.TryParse(e.Value?.ToString(), out value))
    {
        e.Value = string.Format("{0:n0}", value);
    }
}
Другие вопросы по тегам