0

我恳请您耐心阅读我的故事,以解决一个看似简单的问题,

我的主要目的是在 datagridview 中做千位分隔符,这意味着当我输入 12345 时它变成 12,345 与其他任务的区别是当用户在他或她离开单元格时不输入时执行此操作,

我在 datagridview 事件中找不到任何方法,只要我在单元格中添加一个数字就会触发,例如,如果目的是在 feeColumn 中写入 12345,它必须被触发五次,

经过多次研究,我遇到了这段代码,但它有一些问题:

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 但是当我输入时我的网格中仍然没有逗号,

我真的厌倦了这个问题,欢迎任何帮助或任何其他解决方案给我朋友,

4

1 回答 1

0

正如 Reza Aghaei 正确指出的那样,这里的想法是处理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--;
        }
    }
}

希望这可以帮助。


旁注:如果这让您的用户感到厌烦(完全合理,因为这不是正常的预期行为 - 在实时编辑期间更改用户输入),很容易恢复为:

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);
    }
}
于 2016-12-16T19:39:38.197 回答