I have added TextBox
control inside the grid: I want my DataGridView
TextBox
column to hold numbers without any decimal values. How can I do it?
From: http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/919b059c-dba9-40d2-bac7-608a9b120336
You can handle the DataGridView.EditingControlShowing event to cast the editing control to TextBox when editing in the column you want to restrict input on, and attach KeyPress event to the TextBox, in the KeyPress event handler function, we can call the char.IsNumber() method to restrict the key board input, something like this:
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2");
for (int j = 0; j < 10; j++)
{
dt.Rows.Add(j, "aaa" + j.ToString());
}
this.dataGridView1.DataSource = dt;
this.dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(
dataGridView1_EditingControlShowing);
}
private bool IsHandleAdded;
void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
if (!IsHandleAdded &&
this.dataGridView1.CurrentCell.ColumnIndex == 0)
{
TextBox tx = e.Control as TextBox;
if (tx != null)
{
tx.KeyPress += new KeyPressEventHandler(tx_KeyPress);
this.IsHandleAdded = true;
}
}
}
void tx_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(char.IsNumber(e.KeyChar) || e.KeyChar == '\b'))
{
e.Handled = true;
}
}
public Form1()
{
InitializeComponent();
dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
}
private void dataGridView1_EditingControlShowing(object sender , DataGridViewEditingControlShowingEventArgs e)
{
// Convert the editing control to a TextBox to register for KeyPress event
TextBox txt_edit = e.Control as TextBox;
if(txt_edit != null)
{
// Remove any existing handler
txt_edit.KeyPress -= TextBoxKeyPressed;
// Add the new handler
txt_edit.KeyPress += TextBoxKeyPressed;
}
}
private void TextBoxKeyPressed(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
// Test for numeric value or backspace in first column
// Change this to whatever column you only want digits for
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
// If its a numeric or backspace, display it. Not a numeric, ignore it
e.Handled = (!Char.IsDigit(e.KeyChar) && (e.KeyChar != (char)Keys.Back));
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With