Вы также можете попробовать прослушать событие TextChanged элемента управления редактирования столбца DataFridViewTextBox и запретить пользователю вводить недопустимые значения в текстовое поле.Пример:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
string _prevValue;
int _selLength;
int _selStart;
private bool _ignoreTxtChange;
public Form1()
{
DataGridView dataGridView = new DataGridView();
dataGridView.Dock = DockStyle.Fill;
Controls.Add(dataGridView);
DataTable ds = new DataTable();
ds.Columns.Add("FloatValue", typeof(float));
dataGridView.DataSource = ds;
dataGridView.EditingControlShowing += dataGridView_EditingControlShowing;
}
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridView dataGridView = (DataGridView)sender;
TextBox textBox = e.Control as TextBox;
if (textBox == null)
{
return;
}
textBox.TextChanged -= textBox_TextChanged;
DataGridViewColumn floatColumn = dataGridView.Columns["FloatValue"];
if (dataGridView.CurrentCell.ColumnIndex != floatColumn.Index)
{
return;
}
textBox.TextChanged += textBox_TextChanged;
_prevValue = textBox.Text;
}
void textBox_TextChanged(object sender, EventArgs e)
{
if (_ignoreTxtChange)
{
return;
}
_ignoreTxtChange = true;
TextBox textBox = (TextBox)sender;
float value;
if ((_prevValue == textBox.Text) || float.TryParse(textBox.Text, out value))
{
_prevValue = textBox.Text;
_selLength = textBox.SelectionLength;
_selStart = textBox.SelectionStart;
}
else
{
textBox.Text = _prevValue;
textBox.Select((_selStart == 0) ? 0 : _selStart - 1, _selLength);
}
_ignoreTxtChange = false;
}
}
}