我有一个DataGridView,我想在我的DataGridView里有一个类似于MaskedTextBox的东西。它不一定要是一个确切的MaskedTextBox,但至少在某种程度上表现得像一个。
这是我的DataGridView的样子。

我想要的是修改DataGridView右栏(Durée - 'Duration')的人,遵循00:00:00的时间掩码模式。
另一种解决方案是放置一个DateTimePicker。但是与使用MaskedTextBox的解决方案类似,它不应该作为DataGridView列存在。
我曾尝试使用列的生成器添加行为→格式,但我认为这并不完全相同。我需要一些东西来防止用户添加随机的东西。
发布于 2016-04-14 04:25:43
您(至少)有两个选择:
TextBox上的常规MaskedTextBox TextBox。下面是这两种情况的示例:
首先,我们为控件创建类级别变量:
TextBox editBox = new TextBox();
MaskedTextBox editMBox = new MaskedTextBox();要获取对编辑textbox的引用,我们编写EditingControlShowing事件:
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
editBox = e.Control as TextBox;
}为了控制用户输入,我们挂钩了KeyPress事件:
public Form1()
{
InitializeComponent();
..
editBox.KeyPress += editBox_KeyPress;
..
}在这里,我们可以做各种检查,防止恶意字符进入。所有常规属性都在那里..:
void editBox_KeyPress(object sender, KeyPressEventArgs e)
{
string sNew = editBox.Text.Substring(0, editBox.SelectionStart)
+ e.KeyChar + editBox.Text.Substring(editBox.SelectionStart);
Console.WriteLine(sNew);
e.Handled = !validateMethod(sNew);
}这将调用一个您可以编写的函数..
,但是如果你对 MaskedTextBox 很满意,你可以简单地使用一个:
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewCell cell = dataGridView1.CurrentCell;
editMBox.Parent = dataGridView1;
editMBox.Location = dataGridView1.GetCellDisplayRectangle(cell.ColumnIndex,
cell.RowIndex, false).Location;
editMBox.Size = editBox.Size;
editMBox.Show();
editMBox.Mask = yourMask;
editMBox.BringToFront();
}我们需要连接KeyPress事件,以便MaskedTextBox结束编辑。下面是一种简单的方法,可以在按下Enter时接受该值。
您将希望在此处处理Esc,至少还需要处理CurrentCellChanged事件,以实现更完整的控制。
void editMBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13)
{
editBox.Text = editMBox.Text;
editMBox.Hide();
}
}发布于 2016-04-14 20:53:42
我发现了这个整洁的小程序MaskedTextBoxColumn in DataGridViews。我早一点就发现了这一点,但我不愿意下载,因为我们必须注册和其他东西。实际上做得很好。掩码属性有点太简单了,因为它缺少一些很好的特性,但是MaskedTextBox的一般思想是存在的。
https://stackoverflow.com/questions/36601058
复制相似问题