在cellendedit事件之后,vb.net设置单元格数字格式

时间:2014-11-09 22:05:52

标签: vb.net datagridview

我在DataGridView中预定了列。 有两个可编辑列和一个只读列。 我已将所有列格式设置为来自cellstyle builder

的数字样式

当我在两列中输入一些文本时,格式不会改变,但是只读列会改变。

所以我在cellformatting事件上添加了格式更改,例如

    Dim c As String
    If e.ColumnIndex = colHrg.Index _
        AndAlso e.Value IsNot Nothing AndAlso e.RowIndex >= 0 Then
        c = e.Value.ToString
        e.Value = c
    End If
    e.CellStyle.Format = "N3"

但似乎事件没有被触发,所以我决定在cellendedit事件上添加格式样式。 然而,它仍然没有奏效

    dgv_beli.Columns("colHrg").DefaultCellStyle.Format = "N3"

我还尝试了editingcontrolshowingcellvaluechanged事件,但仍无效

有人可以指导我如何解决这个问题。我花了很多时间来解决这个问题,真的好奇为我的问题找到一个好的解决方案。

1 个答案:

答案 0 :(得分:0)

  1. 添加EditingControlShowing事件
  2. 在EditingControlShowing中,检查当前单元格是否位于所需列中。
  3. 在EditingControlShowing中注册KeyPress的新事件(如果上述条件为真)。
  4. 删除之前在EditingControlShowing中添加的任何KeyPress事件。
  5. 在KeyPress事件中,检查如果key不是数字,则取消输入。
  6. 示例:

    private void dataGridView1_EditingControlShowing(object sender,  
    DataGridViewEditingControlShowingEventArgs e)
    {
         e.Control.KeyPress -= new KeyPressEventHandler(Column1_KeyPress);
         if (dataGridView1.CurrentCell.ColumnIndex == 0) //Desired Column
         {
            TextBox tb = e.Control as TextBox;
            if (tb != null)
            {
                tb.KeyPress += new KeyPressEventHandler(Column1_KeyPress);
            }
        }
    }
    
    private void Column1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
        { 
            e.Handled = true;
        }
    }