C# DataGridView屏蔽文本框列

C# DataGridView屏蔽文本框列,c#,winforms,datagridview,maskedtextbox,C#,Winforms,Datagridview,Maskedtextbox,我有一个包含两列的DataGridView,我想为它创建某种类型的输入掩码。所以我发现了一个继承maskedtextbox控件的小类,它允许您在datagridview中使用它。一切正常,面具正常,没什么大不了的。这是图书馆: 我的问题是,一旦行具有我需要的所有数据,按enter或tab键不会创建新行,即使我有datagridview1.AllowUserToAddress=true。 然后我发现问题出在我链接的库中,因为当我添加一个简单的datagrid文本框时,按enter或tab键会创建一

我有一个包含两列的DataGridView,我想为它创建某种类型的输入掩码。所以我发现了一个继承maskedtextbox控件的小类,它允许您在datagridview中使用它。一切正常,面具正常,没什么大不了的。这是图书馆:

我的问题是,一旦行具有我需要的所有数据,按enter或tab键不会创建新行,即使我有datagridview1.AllowUserToAddress=true。 然后我发现问题出在我链接的库中,因为当我添加一个简单的datagrid文本框时,按enter或tab键会创建一个新行

所以我添加了这个例程,希望在最后一行的最后一列创建一个新行:

private void dgOre_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if(e.RowIndex== dgOre.Rows.Count-1 && e.ColumnIndex== dgOre.Columns.Count - 1){
            dgOre.Rows.Add();
    }
}
这个例程的问题是,它确实添加了一行,但它在最后一行之前创建了一行,创建了一个间隙,就像我在启动其他事件之前创建了一行一样。我应该更改maskedtextbox库中的某些内容,或者使用不同的事件,但我不知道如何编辑以及编辑什么

以下是编辑控件的源代码:

public class DataGridViewMaskedTextEditingControl : MaskedTextBox, 
    IDataGridViewEditingControl
{
    #region Fields
    private DataGridView dataGridView;
    private bool valueChanged;
    private int rowIndex;
    #endregion
    #region Constructor
    public DataGridViewMaskedTextEditingControl()
    {
        Mask = String.Empty;
    }
    #endregion
    #region Interface's properties
    public DataGridView EditingControlDataGridView
    {
        get { return dataGridView; }
        set { dataGridView = value; }
    }
    public object EditingControlFormattedValue
    {
        get { return Text; }
        set
        {
            if (value is string)
                Text = (string)value;
        }
    }
    public int EditingControlRowIndex
    {
        get { return rowIndex; }
        set { rowIndex = value; }
    }
    public bool EditingControlValueChanged
    {
        get { return valueChanged; }
        set { valueChanged = value; }
    }
    public Cursor EditingPanelCursor
    {
        get { return base.Cursor; }
    }
    public bool RepositionEditingControlOnValueChange
    {
        get { return false; }
    }

    #endregion
    #region Interface's methods
    public void ApplyCellStyleToEditingControl(
        DataGridViewCellStyle dataGridViewCellStyle)
    {
        Font = dataGridViewCellStyle.Font;
        //  get the current cell to use the specific mask string
        DataGridViewMaskedTextCell cell
            = dataGridView.CurrentCell as DataGridViewMaskedTextCell;
        if (cell != null)
        {
            Mask = cell.Mask;
        }
    }
    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
    {
        //  Note: In a DataGridView, one could prefer to change the row using
        //  the up/down keys.
        switch (key & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
                return true;
            default:
                return false;
        }
    }
    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return EditingControlFormattedValue;
    }
    public void PrepareEditingControlForEdit(bool selectAll)
    {
        if (selectAll)
            SelectAll();
        else
        {
            SelectionStart = 0;
            SelectionLength = 0;
        }
    }
    #endregion
    #region MaskedTextBox event
    protected override void OnTextChanged(System.EventArgs e)
    {
        base.OnTextChanged(e);
        EditingControlValueChanged = true;
        if (EditingControlDataGridView != null)
        {
            EditingControlDataGridView.CurrentCell.Value = Text;
        }
    }
    #endregion
}
protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    EditingControlValueChanged = true;
    EditingControlDataGridView.NotifyCurrentCellDirty(true);
}

在编辑控件中进行更改时,应使用网格通知网格更改。因此,您可以在编辑控件中编写这样的代码:

public class DataGridViewMaskedTextEditingControl : MaskedTextBox, 
    IDataGridViewEditingControl
{
    #region Fields
    private DataGridView dataGridView;
    private bool valueChanged;
    private int rowIndex;
    #endregion
    #region Constructor
    public DataGridViewMaskedTextEditingControl()
    {
        Mask = String.Empty;
    }
    #endregion
    #region Interface's properties
    public DataGridView EditingControlDataGridView
    {
        get { return dataGridView; }
        set { dataGridView = value; }
    }
    public object EditingControlFormattedValue
    {
        get { return Text; }
        set
        {
            if (value is string)
                Text = (string)value;
        }
    }
    public int EditingControlRowIndex
    {
        get { return rowIndex; }
        set { rowIndex = value; }
    }
    public bool EditingControlValueChanged
    {
        get { return valueChanged; }
        set { valueChanged = value; }
    }
    public Cursor EditingPanelCursor
    {
        get { return base.Cursor; }
    }
    public bool RepositionEditingControlOnValueChange
    {
        get { return false; }
    }

    #endregion
    #region Interface's methods
    public void ApplyCellStyleToEditingControl(
        DataGridViewCellStyle dataGridViewCellStyle)
    {
        Font = dataGridViewCellStyle.Font;
        //  get the current cell to use the specific mask string
        DataGridViewMaskedTextCell cell
            = dataGridView.CurrentCell as DataGridViewMaskedTextCell;
        if (cell != null)
        {
            Mask = cell.Mask;
        }
    }
    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
    {
        //  Note: In a DataGridView, one could prefer to change the row using
        //  the up/down keys.
        switch (key & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
                return true;
            default:
                return false;
        }
    }
    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return EditingControlFormattedValue;
    }
    public void PrepareEditingControlForEdit(bool selectAll)
    {
        if (selectAll)
            SelectAll();
        else
        {
            SelectionStart = 0;
            SelectionLength = 0;
        }
    }
    #endregion
    #region MaskedTextBox event
    protected override void OnTextChanged(System.EventArgs e)
    {
        base.OnTextChanged(e);
        EditingControlValueChanged = true;
        if (EditingControlDataGridView != null)
        {
            EditingControlDataGridView.CurrentCell.Value = Text;
        }
    }
    #endregion
}
protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    EditingControlValueChanged = true;
    EditingControlDataGridView.NotifyCurrentCellDirty(true);
}

主要问题是在
DataGridViewMaskedTextEditingControl
类中,在
OnTextChanged
方法中。好的,非常感谢。我明天会测试它,因为我没有工作,但是这个应该是解决方案。我相信库需要更多的修复,例如
InitializeEditingControl
中的
(string)Value
类是完全错误的<代码>值。ToString()更好。更正确的方法是
var str=initialFormattedValue作为字符串
然后
如果(str==null)str=string.EmptyeditingControl.Text=str该库有一些明显的问题,但它足够满足我的需要。我设法做了更多的测试,你的修复确实有效,所以我将其标记为已接受,非常感谢你的帮助