如何创建datagridview的NumericUpDown列

Tik*_*ani 5 c# winforms

我想在datagridview中添加NumericUpDown类型的列。所以我为此创建了自定义列类型,并且工作正常,但此控件每次可见。我只想在我输入此列(NumericUpdown列)的特定单元格时仅显示此控件。我想要如以下屏幕截图所示。 在此处输入图片说明

任何帮助将不胜感激。

小智 6

我修改了 Web 示例,包括最小/最大范围。

\n\n
public class NumericUpDownColumn : DataGridViewColumn\n{\n    public NumericUpDownColumn()\n        : base(new NumericUpDownCell())\n    {\n    }\n\n    public override DataGridViewCell CellTemplate\n    {\n        get { return base.CellTemplate; }\n        set\n        {\n            if (value != null && !value.GetType().IsAssignableFrom(typeof(NumericUpDownCell)))\n            {\n                throw new InvalidCastException("Must be a NumericUpDownCell");\n            }\n            base.CellTemplate = value;\n        }\n    }\n}\n\npublic class NumericUpDownCell : DataGridViewTextBoxCell\n{\n    private readonly decimal min;\n    private readonly decimal max;\n\n    public NumericUpDownCell()\n        : base()\n    {\n        Style.Format = "F0";\n    }\n    public NumericUpDownCell(decimal min, decimal max)\n        : base()\n    {\n        this.min = min;\n        this.max = max;\n        Style.Format = "F0";\n    }\n\n    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)\n    {\n        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);\n        NumericUpDownEditingControl ctl = DataGridView.EditingControl as NumericUpDownEditingControl;\n        ctl.Minimum = this.min;\n        ctl.Maximum = this.max;\n        ctl.Value = Convert.ToDecimal(this.Value);\n    }\n\n    public override Type EditType\n    {\n        get { return typeof(NumericUpDownEditingControl); }\n    }\n\n    public override Type ValueType\n    {\n        get { return typeof(Decimal); }\n    }\n\n    public override object DefaultNewRowValue \n    {\n        get { return null; } //\xe6\x9c\xaa\xe7\xb7\xa8\xe9\x9b\x86\xe3\x81\xae\xe6\x96\xb0\xe8\xa6\x8f\xe8\xa1\x8c\xe3\x81\xab\xe4\xbd\x99\xe8\xa8\x88\xe3\x81\xaa\xe5\x88\x9d\xe6\x9c\x9f\xe5\x80\xa4\xe3\x81\x8c\xe5\x87\xba\xe3\x81\xaa\xe3\x81\x84\xe3\x82\x88\xe3\x81\x86\xe3\x81\xab\xe3\x81\x99\xe3\x82\x8b\n    }\n}\n\npublic class NumericUpDownEditingControl : NumericUpDown, IDataGridViewEditingControl\n{\n    private DataGridView dataGridViewControl;\n    private bool valueIsChanged = false;\n    private int rowIndexNum;\n\n    public NumericUpDownEditingControl()\n        : base()\n    {\n        this.DecimalPlaces = 0;\n    }\n\n    public DataGridView EditingControlDataGridView\n    {\n        get { return dataGridViewControl; }\n        set { dataGridViewControl = value; }\n    }\n\n    public object EditingControlFormattedValue\n    {\n        get{ return this.Value.ToString("F0"); }\n        set{ this.Value = Decimal.Parse(value.ToString()); }\n    }\n    public int EditingControlRowIndex\n    {\n        get { return rowIndexNum; }\n        set { rowIndexNum = value; }\n    }\n    public bool EditingControlValueChanged\n    {\n        get { return valueIsChanged; }\n        set { valueIsChanged = value; }\n    }\n\n    public Cursor EditingPanelCursor\n    {\n        get { return base.Cursor; }\n    }\n\n    public bool RepositionEditingControlOnValueChange\n    {\n        get { return false; }\n    }\n\n    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)\n    {\n        this.Font = dataGridViewCellStyle.Font;\n        this.ForeColor = dataGridViewCellStyle.ForeColor;\n        this.BackColor = dataGridViewCellStyle.BackColor;\n    }\n\n    public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)\n    {\n        return (keyData == Keys.Left || keyData == Keys.Right ||\n            keyData == Keys.Up || keyData == Keys.Down ||\n            keyData == Keys.Home || keyData == Keys.End ||\n            keyData == Keys.PageDown || keyData == Keys.PageUp);\n    }\n\n    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)\n    {\n        return this.Value.ToString();\n    }\n\n    public void PrepareEditingControlForEdit(bool selectAll)\n    {\n    }\n\n    protected override void OnValueChanged(EventArgs e)\n    {\n        valueIsChanged = true;\n        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);\n        base.OnValueChanged(e);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


diz*_*low 1

这可能更像是一种解决方法,而不是解决方案,但您可以考虑编写一个简单的自定义表单,当您单击单元格时,该表单会直接显示在单元格上。该自定义表单将为您提供所需的 numericUpDown 行为,然后只要您单击 DataGridView 上的其他任何位置,自定义表单就会被隐藏,其值将保存到单元格中。看起来这将是处理问题并获得相同行为的简单方法。祝你好运。