自定义 DataGridView 列值在失去焦点后消失
Custom DataGridViewColumn value disappears after loosing focus
我在 WinForms 中为我的项目创建了自定义 DataGridViewColumn。控件呈现完美,但是一旦我输入值并移动到另一个单元格,该值就会消失并在我签入 CellEndEdit 时显示为 null。
代码如下:
class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public NumericEditControl()
{
this.Value = 0;
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
}
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
public object EditingControlFormattedValue
{
get
{
return this.Value;
}
set
{
this.Value = Convert.ToDouble(value);
}
}
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return !dataGridViewWantsInputKey;
}
}
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
}
单元格class如下:
public class NumericCell : DataGridViewTextBoxCell
{
public NumericCell()
: base()
{
this.Style.Format = "0";
}
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
NumericEditControl ctl =
DataGridView.EditingControl as NumericEditControl;
// Use the default row value when Value property is null.
if (this.Value == null)
{
ctl.Value = 0;
}
else
{
ctl.Value = (double)this.Value;
}
}
public override Type EditType
{
get
{
return typeof(NumericEditControl);
}
}
public override Type ValueType
{
get
{
return typeof(double);
}
}
public override object DefaultNewRowValue
{
get
{
return "0";
}
}
}
最后是 DataGridViewColumn
public class NumericDataColumn : DataGridViewColumn
{
public NumericDataColumn()
: base(new NumericCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(NumericCell)))
{
throw new InvalidCastException("Must be a Numeric");
}
base.CellTemplate = value;
}
}
}
在设计器中
private GridControl.NumericDataColumn colRoll;
它呈现控件,但我不明白为什么值消失了。你能帮帮我吗
事实证明,我们还必须处理控件的文本/值更改事件,直到并且除非单元格变脏,否则该值将不会保留。所以我不得不将以下方法添加到我的 NumericEditControl class
class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
//Old code here
protected override void OnTextChanged(EventArgs e)
{
if (dataGridView != null)
{
valueChanged = true;
this.dataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
}
}
添加此方法救了我的命,我的控件现在可以正常工作了:D 感谢您的输入。
我在 WinForms 中为我的项目创建了自定义 DataGridViewColumn。控件呈现完美,但是一旦我输入值并移动到另一个单元格,该值就会消失并在我签入 CellEndEdit 时显示为 null。
代码如下:
class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public NumericEditControl()
{
this.Value = 0;
}
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
}
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
public object EditingControlFormattedValue
{
get
{
return this.Value;
}
set
{
this.Value = Convert.ToDouble(value);
}
}
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return !dataGridViewWantsInputKey;
}
}
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
}
单元格class如下:
public class NumericCell : DataGridViewTextBoxCell
{
public NumericCell()
: base()
{
this.Style.Format = "0";
}
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
NumericEditControl ctl =
DataGridView.EditingControl as NumericEditControl;
// Use the default row value when Value property is null.
if (this.Value == null)
{
ctl.Value = 0;
}
else
{
ctl.Value = (double)this.Value;
}
}
public override Type EditType
{
get
{
return typeof(NumericEditControl);
}
}
public override Type ValueType
{
get
{
return typeof(double);
}
}
public override object DefaultNewRowValue
{
get
{
return "0";
}
}
}
最后是 DataGridViewColumn
public class NumericDataColumn : DataGridViewColumn
{
public NumericDataColumn()
: base(new NumericCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(NumericCell)))
{
throw new InvalidCastException("Must be a Numeric");
}
base.CellTemplate = value;
}
}
}
在设计器中
private GridControl.NumericDataColumn colRoll;
它呈现控件,但我不明白为什么值消失了。你能帮帮我吗
事实证明,我们还必须处理控件的文本/值更改事件,直到并且除非单元格变脏,否则该值将不会保留。所以我不得不将以下方法添加到我的 NumericEditControl class
class NumericEditControl : NumericTextBox, IDataGridViewEditingControl
{
//Old code here
protected override void OnTextChanged(EventArgs e)
{
if (dataGridView != null)
{
valueChanged = true;
this.dataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
}
}
添加此方法救了我的命,我的控件现在可以正常工作了:D 感谢您的输入。