Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TextBox Column In DataGridView

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?

like image 984
Lijina Avatar asked Sep 27 '11 11:09

Lijina


2 Answers

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;
   }
}
like image 79
stuartd Avatar answered Oct 10 '22 20:10

stuartd


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));
   }
}
like image 36
SwDevMan81 Avatar answered Oct 10 '22 20:10

SwDevMan81