首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridView MaskedTextBoxColumn

DataGridView MaskedTextBoxColumn
EN

Stack Overflow用户
提问于 2016-04-13 22:11:14
回答 2查看 292关注 0票数 0

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

这是我的DataGridView的样子。

我想要的是修改DataGridView右栏(Durée - 'Duration')的人,遵循00:00:00的时间掩码模式。

另一种解决方案是放置一个DateTimePicker。但是与使用MaskedTextBox的解决方案类似,它不应该作为DataGridView列存在。

我曾尝试使用列的生成器添加行为→格式,但我认为这并不完全相同。我需要一些东西来防止用户添加随机的东西。

EN

回答 2

Stack Overflow用户

发布于 2016-04-14 04:25:43

您(至少)有两个选择:

  • 您可以使用覆盖在DGV创建的用于编辑的TextBox上的常规MaskedTextBox
  • 您可以编写常规编辑控件的代码,即DGV进入编辑模式时显示的TextBox

下面是这两种情况的示例:

首先,我们为控件创建类级别变量:

代码语言:javascript
复制
TextBox editBox = new TextBox();
MaskedTextBox editMBox = new MaskedTextBox();

要获取对编辑textbox的引用,我们编写EditingControlShowing事件:

代码语言:javascript
复制
private void dataGridView1_EditingControlShowing(object sender, 
                           DataGridViewEditingControlShowingEventArgs e)
{
    editBox = e.Control as TextBox;
}

为了控制用户输入,我们挂钩了KeyPress事件:

代码语言:javascript
复制
public Form1()
{
    InitializeComponent();
    ..
    editBox.KeyPress += editBox_KeyPress;
    ..
}

在这里,我们可以做各种检查,防止恶意字符进入。所有常规属性都在那里..:

代码语言:javascript
复制
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 很满意,你可以简单地使用一个:

代码语言:javascript
复制
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事件,以实现更完整的控制。

代码语言:javascript
复制
void editMBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)13)
    {
        editBox.Text = editMBox.Text;
        editMBox.Hide();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-14 20:53:42

我发现了这个整洁的小程序MaskedTextBoxColumn in DataGridViews。我早一点就发现了这一点,但我不愿意下载,因为我们必须注册和其他东西。实际上做得很好。掩码属性有点太简单了,因为它缺少一些很好的特性,但是MaskedTextBox的一般思想是存在的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36601058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档