Datagridview文本框离开事件

时间:2017-06-23 12:01:10

标签: c# winforms

我有一个将文本框值格式化为货币的函数。我在Textbox Leave事件中这样做了。

private void txtSellingPrice_Leave(object sender, EventArgs e)
{
  txtSellingPrice.Text = FormatCurrency(txtSellingPrice.Text);
}

用户输入100的示例,输出将为100美元。

我的问题是如何在datagridview单元格中执行此操作?我已经尝试在编辑控件中添加leave事件。我也尝试过DefaultCellStyle.Format =" C2",这可行,但是当用户更改当前值时,请将$ 100.00更改为50.输出应为$ 50.00。感谢。

1 个答案:

答案 0 :(得分:0)

简单方法是将BindingSource分配给DataGridView,将BindingList分配给BindingSoure。将显示货币的列的默认单元格样式设置为C2。

如果您已完成此操作,则会自动为您的货币列添加/更改/删除任何单元格。

但是,如果您不想使用BindingSource,则必须自己进行格式化。使用事件DataGridViewCell.CellValidating和DataGridViewCell.CellFormating。

假设您有一个columnCurrency,其十进制值应以格式C2显示。 DefaultCellFormat设置为C2。

验证单元格后,检查该值是否真的是小数:

private void OnCellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (e.RowIndex == -1) return;
    if (e.ColumnIndex == this.columnValue.Index)
    {
        decimal value;
        e.Cancel = !Decimal.TryParse((string)e.FormattedValue, out value);
    }
}

每当必须格式化单元格时,请格式化e.Value中的值:

private void OnCellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == this.columnValue.Index)
    {
        if (e.Value == null)
        {   // show the Null value:
            e.Value = e.CellStyle.NullValue;
            e.FormattingApplied = true;
        }
        else
        {   // because validated I know value is a decimal:
            decimal value = Decimal.Parse((string)e.Value);
            e.Value = value.ToString(e.CellStyle.Format);
            e.FormattingApplied = true;
        }

        // If desired apply other formatting, like background colouring etc
    }
}

如果您不想使用“C2”作为货币格式,并且更喜欢使用您的函数FormatCurrency,则必须创建一个使用FormatCurrency格式化并设置FormatProvider的FormatProvider DefaultCellStyle

 private void OnCellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == this.columnValue.Index)
    {
        ... (check for null value as described above)
        else
        {
            e.Value = String.Format(e.Value, e.CellStyle.FormatProvider);
            e.FormattingApplied = true;