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

任何帮助将不胜感激。
小智 6
我修改了 Web 示例,包括最小/最大范围。
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n
这可能更像是一种解决方法,而不是解决方案,但您可以考虑编写一个简单的自定义表单,当您单击单元格时,该表单会直接显示在单元格上。该自定义表单将为您提供所需的 numericUpDown 行为,然后只要您单击 DataGridView 上的其他任何位置,自定义表单就会被隐藏,其值将保存到单元格中。看起来这将是处理问题并获得相同行为的简单方法。祝你好运。
| 归档时间: |
|
| 查看次数: |
7756 次 |
| 最近记录: |