Hello
I have DataGridView with DataTable as source
dt = new DataTable();
dt.Columns.Add(new DataColumn("testString", typeof(String)));
dt.Columns.Add(new DataColumn("testDate", typeof(DateTime)));
dataGridView1.DataSource = dt;For the second column "testDate" i try to use hosted MaskedTextBox for editing
but in any cases i reseive error (e.Exception.Message) "String was not recognized as valid DateTime" even if it is valid date
If i press ESC key if string is valid date value is accepted but still the same cell is focused.
Also if i click first the cell with mouse and edit after that than is ok.
Please for sugestions,
Best regards,
My Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
namespace TestDGV
{
public partial class Form1 : Form
{
DataGridView dataGridView1;
DataTable dt;
MaskedTextBox maskedTextBoxForEditing;
bool IsKeyPressHandled = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// New DataGridView
dataGridView1 = new DataGridView();
dataGridView1.Dock = DockStyle.Fill;
this.Controls.Add(dataGridView1);
// New DataTable
dt = new DataTable();
dt.Columns.Add(new DataColumn("testString", typeof(String)));
dt.Columns.Add(new DataColumn("testDate", typeof(DateTime)));
dataGridView1.DataSource = dt;
// MaskedTextBox
this.maskedTextBoxForEditing = new MaskedTextBox();
this.maskedTextBoxForEditing.Mask = "00/00/0000";
this.maskedTextBoxForEditing.PromptChar = ' ';
// Hide the MaskedTextBox
this.maskedTextBoxForEditing.Visible = false;
// Add the MaskedTextBox to the DataGridView's control collection
this.dataGridView1.Controls.Add(this.maskedTextBoxForEditing);
// the current editing cell
this.dataGridView1.CellBeginEdit +=
new DataGridViewCellCancelEventHandler(dataGridView1_CellBeginEdit);
// Handle the CellEndEdit event to hide the MaskedTextBox when
// editing completes.
this.dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
// Handle the Scroll event to adjust the location of the MaskedTextBox as it is showing
// when scrolling the DataGridView
this.dataGridView1.Scroll += new ScrollEventHandler(dataGridView1_Scroll);
// Handle the EditingControlShowing event to pass the focus to the
// MaskedTextBox when begin editing with keystrokes
this.dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
// Attach the DataError event to the corresponding event handler.
this.dataGridView1.DataError +=
new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
}
#region For MaskedTextBox
void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
// If the current cell is on the "MaskColumn", we use the MaskedTextBox control
// for editing instead of the default TextBox control;
if (e.ColumnIndex == this.dataGridView1.Columns["testDate"].Index)
{
// Calculate the cell bounds of the current cell
Rectangle rect = this.dataGridView1.GetCellDisplayRectangle(
e.ColumnIndex, e.RowIndex, true);
// Adjust the MaskedTextBox's size and location to fit the cell
this.maskedTextBoxForEditing.Size = rect.Size;
this.maskedTextBoxForEditing.Location = rect.Location;
// Set value for the MaskedTextBox
if (this.dataGridView1.CurrentCell.Value != null)
{
this.maskedTextBoxForEditing.Text = this.dataGridView1.CurrentCell.Value.ToString();
}
// Show the MaskedTextBox
this.maskedTextBoxForEditing.Visible = true;
}
}
void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// When finish editing on the "MaskColumn", we replace the cell value with
// the text typed in the MaskedTextBox, and hide the MaskedTextBox;
if (e.ColumnIndex == this.dataGridView1.Columns["testDate"].Index)
{
this.dataGridView1.CurrentCell.Value = this.maskedTextBoxForEditing.Text;
// this.dataGridView1.CurrentCell.Value = Convert.ToDateTime(this.maskedTextBoxForEditing.Text);
this.maskedTextBoxForEditing.Text = "";
this.maskedTextBoxForEditing.Visible = false;
}
}
void dataGridView1_Scroll(object sender, ScrollEventArgs e)
{
if (this.dataGridView1.IsCurrentCellInEditMode == true)
{
// Adjust the location for the MaskedTextBox while scrolling
Rectangle rect = this.dataGridView1.GetCellDisplayRectangle(
this.dataGridView1.CurrentCell.ColumnIndex,
this.dataGridView1.CurrentCell.RowIndex, true);
/*
Console.WriteLine(rect.ToString());
Console.WriteLine(this.dataGridView1.CurrentCellAddress.ToString());
Console.WriteLine("");
*/
if (rect.X <= 0 || rect.Y <= 0)
{
this.maskedTextBoxForEditing.Visible = false;
}
else
{
this.maskedTextBoxForEditing.Location = rect.Location;
}
}
}
void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
if (!this.IsKeyPressHandled
&& this.dataGridView1.CurrentCell.ColumnIndex ==
this.dataGridView1.Columns["testDate"].Index)
{
TextBox tb = e.Control as TextBox;
tb.KeyPress += new KeyPressEventHandler(tb_KeyPress);
this.IsKeyPressHandled = true;
}
}
void tb_KeyPress(object sender, KeyPressEventArgs e)
{
if (this.dataGridView1.CurrentCell.ColumnIndex ==
this.dataGridView1.Columns["testDate"].Index)
{
// Prevent the key char to be input in the editing control
// e.Handled = true;
// Set focus to the MaskedTextBox for editing.
this.maskedTextBoxForEditing.SelectionStart = 0;
this.maskedTextBoxForEditing.Focus();
this.maskedTextBoxForEditing.SelectionStart = 0;
// SendKeys.Send(e.KeyChar.ToString());
}
}
void dataGridView1_DataError(object sender,
DataGridViewDataErrorEventArgs e)
{
// If the data source raises an exception when a cell value is
// commited, display an error message.
if (e.Exception != null)
{
MessageBox.Show("Data error !" + "\n\n" + e.Exception.Message);
}
}
#endregion
}
}