gpt4 book ai didi

c# - 自定义 DataGridView 列值在失去焦点后消失

转载 作者:行者123 更新时间:2023-11-30 16:04:24 30 4
gpt4 key购买 nike

我在 WinForms 中为我的项目创建了一个自定义 DataGridViewColumn。控件呈现完美,但一旦我输入值并移动到另一个单元格,该值就会消失并在我 checkin 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;

它呈现控件,但我不明白为什么值消失了。你能帮帮我吗

最佳答案

事实证明,我们还必须处理控件的文本/值更改事件,直到并且除非单元格变脏,否则该值将不会保留。所以我必须将以下方法添加到我的 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 感谢您的输入。

关于c# - 自定义 DataGridView 列值在失去焦点后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35053869/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com