C# 在datagridview单元格中只键入一些字符

C# 在datagridview单元格中只键入一些字符,c#,.net,vb.net,winforms,datagridview,C#,.net,Vb.net,Winforms,Datagridview,是否有一种方法可以只向datagridview单元格添加某些字符? 像“1234567890”?我知道有两种方法可以用于此。第一个(我认为是最好的)是在DataGridView上使用CellValidating事件,并检查输入的文本是否为数字 下面是一个设置行错误值的示例(如果用户取消编辑,则使用附加的CellEndEdit事件处理程序) 第二种方法是使用EditingControlShowing事件和将事件附加到单元格的按键上-我不太喜欢这种方法,因为它会无声地阻止非数字键的输入-尽管我想你可

是否有一种方法可以只向datagridview单元格添加某些字符?
像“1234567890”?

我知道有两种方法可以用于此。第一个(我认为是最好的)是在
DataGridView
上使用CellValidating事件,并检查输入的文本是否为数字

下面是一个设置行错误值的示例(如果用户取消编辑,则使用附加的CellEndEdit事件处理程序)

第二种方法是使用EditingControlShowing事件和将事件附加到单元格的按键上-我不太喜欢这种方法,因为它会无声地阻止非数字键的输入-尽管我想你可以给出一些反馈(如铃声),但与其他方法相比,它感觉需要做更多的工作

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.KeyPress -= TextboxNumeric_KeyPress;
    if ((int)(((System.Windows.Forms.DataGridView)(sender)).CurrentCell.ColumnIndex) == 1)
    {
         e.Control.KeyPress += TextboxNumeric_KeyPress;
    }
}

private void TextboxNumeric_KeyPress(object sender, KeyPressEventArgs e)
{
    bool nonNumberEntered = true;

    if ((e.KeyChar >= 48 && e.KeyChar <= 57) || e.KeyChar == 8)
    {
        nonNumberEntered = false;
    }

    if (nonNumberEntered)
     {
        // Stop the character from being entered into the control since it is non-numerical.
        e.Handled = true;
    }
    else
    {
        e.Handled = false;
    }
}
private void dataGridView1\u EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e)
{
e、 Control.KeyPress-=TextboxNumeric_KeyPress;
如果((int)(((System.Windows.Forms.DataGridView)(发件人)).CurrentCell.ColumnIndex)==1)
{
e、 Control.KeyPress+=TextboxNumeric_KeyPress;
}
}
private void TextboxNumeric_KeyPress(对象发送者,KeyPressEventArgs e)
{
bool nonnumberrentered=true;

如果((e.KeyChar>=48&&e.KeyChar如果希望datagridview简单地删除用户的无效字符,而不是发出错误消息,请使用datagridview.CellParsing()。此事件仅在进行单元格编辑后触发,并允许您覆盖输入的内容

例如:

private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    // If this is column 1
    if (e.ColumnIndex == 1)
    {
        // Remove special chars from cell value
        e.Value = RemoveSpecialCharacters(e.Value.ToString());
        e.ParsingApplied = true;
    }
}

对于RemoveSpecialCharacters()方法,有关从字符串中删除特殊字符的一些优秀方法,请参阅。

第二个解决方案有两个问题。第一个问题是,一旦第一列中的Keypress事件被替换,它对所有列都有效。第二个问题是它链接到自身,因此每次在第一列中按下一个键,处理程序都会再次被添加。是吗y keypress事件发生多次。@RichShealer谢谢,首先删除该事件就解决了这个问题。正如我所说,在这种情况下,这根本不是我的首选方法。@David Hall-这解决了多次调用问题,但留下了我的第一个问题,即所有列都被过滤。我认为要解决这个问题,需要将删除移到
I上方F
以便删除其他不应筛选的单元格的处理程序。@RichShealer啊,是的,忘记了其他文本框列将重用该编辑控件。现在,该处理程序在if之外被删除。@David Hall-我认为这可能是目前Internet上唯一正确的示例!使用EditingControlShowing事件而不是CellP放火看
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    // If this is column 1
    if (e.ColumnIndex == 1)
    {
        // Remove special chars from cell value
        e.Value = RemoveSpecialCharacters(e.Value.ToString());
        e.ParsingApplied = true;
    }
}