Запуск события 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")
}
Теперь, что не так?
Когда это в первую очередь идет к
grdTrading_CurrentCellDirtyStateChanged
и сделать commitedit больше не позволяет помещать какие-либо данные в ячейку и удалять данные, пока пользователь меняет свою ячейкутеперь вы предполагаете, что есть данные, они успешно запускаются и даже запускаются
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);
}
}