【问题标题】:How to set datagridview cell format when editing and after editing in C#?在 C# 中编辑时和编辑后如何设置 datagridview 单元格格式?
【发布时间】:2018-09-25 22:22:32
【问题描述】:

DataGridView的格式在加载时是正确的。但是当我尝试编辑该值并接受它(输入或制表符)时,格式不适用。

我已添加此CellEndEdit 事件,希望它能在编辑后更正格式。

private void dataGridSales_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    if (dataGridSales.CurrentCell.ColumnIndex == 2)
    {
        dataGridSales.Columns[2].DefaultCellStyle.Format = "N2";
    }
}

private void dataGridSales_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 2)
    {
        double price = Convert.ToDouble(dataGridSales.Rows[e.RowIndex].Cells[2].Value);
        dataGridSales.Columns[2].DefaultCellStyle.Format = "C2";

    }
}

private void dataGridSales_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
        dataGridSales.Columns[2].DefaultCellStyle.Format = "C2";
}

但它仍然没有显示正确的格式。

编辑前的单元格值:

处于编辑模式的单元格:

如何将格式更改为N2 或在编辑时删除货币符号?您可以在上面看到我的CellBeginEdit 事件,它将整列格式更改为N2。我只想更改选定的单元格。

编辑后的单元格值:

列默认单元格样式:

dataGridSales 事件代码:

    //Change Total Amount when Price Column is changed
    private void dataGridSales_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        int count = 0;
        double total = 0;
        foreach (DataGridViewRow row in dataGridSales.Rows)
        {
            total += Convert.ToDouble(row.Cells[2].Value);
        }
        lblTotAmt.Text = "Total Amount: " + total.ToString("C2");
        lblTotItem.Text = "Total Items: " + count;
    }
    //Remove item/s
    private void dataGridSales_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
    {
        int count = 0;
        double total = 0;
        foreach (DataGridViewRow row in dataGridSales.Rows)
        {
            total += Convert.ToDouble(row.Cells[2].Value);
        }
        lblTotAmt.Text = "Total Amount: " + total.ToString("C2");
        lblTotItem.Text = "Total Items: " + count;
    }
    //Price Column check
    private void dataGridSales_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        e.Control.KeyPress -= new KeyPressEventHandler(colPrice_KeyPress);
        //e.Control.KeyDown -= new KeyEventHandler(dataGridSales_KeyDown);
        if (dataGridSales.CurrentCell.ColumnIndex == 2)
        {
            TextBox tb = e.Control as TextBox;
            if (tb != null)
            {
                tb.KeyPress += new KeyPressEventHandler(colPrice_KeyPress);
            }
            if (e.Control is TextBox)
            {
                cprice = e.Control as TextBox;
            }
        }
    }
    //Price Column keypress only accept numbers
    private void colPrice_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
        {
            e.Handled = true;
        }
        TextBox txtDec = sender as TextBox;
        if (e.KeyChar == '.' && txtDec.Text.Contains("."))
        {
            e.Handled = true;
        }
    }

    private void dataGridSales_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (dataGridSales.CurrentCell.ColumnIndex == 2)
        {
            dataGridSales.Columns[2].DefaultCellStyle.Format = "N2";
        }
    }

    private void dataGridSales_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 2)
        {
            double price = Convert.ToDouble(dataGridSales.Rows[e.RowIndex].Cells[2].Value);
            dataGridSales.Columns[2].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("en-PH");
            dataGridSales.Columns[2].DefaultCellStyle.Format = String.Format("C2");
            dataGridSales.Columns[2].ValueType = typeof(Double);
        }
    }

    //Double click on a cell to edit
    private void dataGridSales_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 2)
        {
            dataGridSales.BeginEdit(true);
        }
    }

【问题讨论】:

  • 这是winform还是wpf?
  • @Alander 在 winform 中。

标签: c# winforms visual-studio datagridview


【解决方案1】:

您的问题是您没有指定格式化程序应该格式化的文化。这应该可以解决您的问题。

private void dataGridSales_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 2)
    {
        double price = Convert.ToDouble(dataGridSales.Rows[e.RowIndex].Cells[2].Value);
            dataGridSales.Columns[2].DefaultCellStyle
                                    .FormatProvider = CultureInfo.GetCultureInfo("en-US");
            dataGridSales.Columns[2].DefaultCellStyle.Format = String.Format("c");

    }
}

请注意,您应将“en-US”替换为所需货币的culture code/index

编辑:

您还应该尝试将以下代码添加到在数据加载之前运行的方法中:

dataGridSales.Columns[2].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("en-US");
dataGridSales.Columns[2].DefaultCellStyle.Format = String.Format("c");
dataGridSales.Columns[2].ValueType = typeof(Double);

【讨论】:

  • 我已经测试过了,它应该可以工作,你能分享dataGridSales的所有事件吗?编辑:您可以尝试将此代码应用于 Form_Load 方法或任何等效方法(在将数据加载到网格视图之前)? dataGridSales.Columns[2].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("en-US"); dataGridSales.Columns[2].DefaultCellStyle.Format = String.Format("c"); dataGridSales.Columns[2].ValueType = typeof(Double);
  • 我已将列defaultstyle设置为上图,还发布了所有dataGridSales事件。编辑后仍然没有应用格式。
  • 我已将第二组代码添加到我的表单加载中,它现在正在工作。谢谢
  • @Jepher 很高兴它有帮助。我的荣幸。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多