繁体   English   中英

立即执行DataGridView CellValueChanged事件以执行千位分隔符

[英]Firing The DataGridView CellValueChanged Event Immediately for doing thousand separator

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

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

每当在单元格中添加一个数字时,我都无法在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并进行grdTrading_CurrentCellDirtyStateChanged ,它不再允许在用户更改其单元格时将任何数据放入单元格并删除该数据

  2. 现在您假设有数据,可以成功运行它,甚至在我将任何数字添加到费用列后都运行cellValueChanged ,我的意思是1然后12然后123然后1234然后12345但我键入时网格中仍然没有逗号,

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

正如Reza Aghaei正确指出的那样,这里的想法是处理DataGridView.EditingControlShowing事件。 他关于在TextBox控件上进行练习的建议是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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM