我在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; }
}
}
细胞类如下:
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;
它呈现控件但我无法理解为什么值正在消失。你能帮帮我吗
答案 0 :(得分:3)
事实证明,我们还必须处理控件的文本/值更改事件,直到除非单元格变脏,否则值将不会保留。所以我必须将以下方法添加到我的NumericEditControl类
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感谢输入。