DataGridView 屏蔽的文本框列
DataGridView Masked TextBox Column
我有一个包含 2 列的 DataGridView,我想为其创建某种输入掩码。所以我找到了一个小的 class,它继承了 maskedtextbox 控件并允许您在数据网格视图中使用它。一切正常,面具按预期工作,没什么大不了的。这是图书馆:http://www.codeproject.com/Articles/26005/DataGridViewColumn-Hosting-MaskedTextBox
我的问题是,一旦该行包含我需要的所有数据,按 Enter 或 Tab 键不会创建新行,即使我有 datagridview1.AllowUserToAddRows = true。
然后我发现问题出在我链接的库中,因为当我添加一个简单的数据网格文本框时,按 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
}
当您的编辑控件发生更改时,您应该使用网格的 NotifyCurrentCellDirty(true)
将更改通知网格。所以你可以在你的编辑控件中写这样的代码:
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
EditingControlValueChanged = true;
EditingControlDataGridView.NotifyCurrentCellDirty(true);
}
我有一个包含 2 列的 DataGridView,我想为其创建某种输入掩码。所以我找到了一个小的 class,它继承了 maskedtextbox 控件并允许您在数据网格视图中使用它。一切正常,面具按预期工作,没什么大不了的。这是图书馆:http://www.codeproject.com/Articles/26005/DataGridViewColumn-Hosting-MaskedTextBox
我的问题是,一旦该行包含我需要的所有数据,按 Enter 或 Tab 键不会创建新行,即使我有 datagridview1.AllowUserToAddRows = true。 然后我发现问题出在我链接的库中,因为当我添加一个简单的数据网格文本框时,按 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
}
当您的编辑控件发生更改时,您应该使用网格的 NotifyCurrentCellDirty(true)
将更改通知网格。所以你可以在你的编辑控件中写这样的代码:
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
EditingControlValueChanged = true;
EditingControlDataGridView.NotifyCurrentCellDirty(true);
}