自定义 datagridview 列控件将不接受句点 (.)
Posted
技术标签:
【中文标题】自定义 datagridview 列控件将不接受句点 (.)【英文标题】:custom datagridview column Control will not accept a period (.) 【发布时间】:2016-02-27 11:58:59 【问题描述】:我无法在网上找到一个控件来接受句点 (.)。我需要能够输入带小数位的数值。我想在 datagridview 单元格中使用 numericupdown 控件,这样我就可以使用上下箭头来调整值。
此控件将 NumericUpDown 控件实现为 datagridview 列上的编辑控件。我在网上找到的(不记得在哪里),ti 是基于一个类似的基于日历控件的自定义 datagridview 列。
我对其进行了一些修改,以便可以设置最大值、最小值、小数位和递增属性。
但是,即使小数位设置为 2 且增量为 0.1,当我输入值时,控件也不会接受句点。
下面是代码,其中包括列、单元格和编辑控件的类。请帮忙。我不知道问题是什么。
公共类 NumericUpDownColumn 继承 DataGridViewColumn 公共子新() MyBase.New(新 NumericUpDownCell()) 结束子 公共覆盖属性 CellTemplate() 作为 DataGridViewCell 得到 返回 MyBase.CellTemplate 结束获取 设置(ByVal 值作为 DataGridViewCell) ' 确保用于模板的单元格是 CalendarCell。 If Not (value Is Nothing) AndAlso _ 不是 value.GetType().IsAssignableFrom(GetType(NumericUpDownCell)) _ 然后 抛出新的 InvalidCastException(“必须是 CalendarCell”) 万一 MyBase.CellTemplate = 值 结束集 结束属性 Private _Maximum 十进制 = 100 Private _Minimum 作为十进制 = 0 私有 _Increment 作为十进制 = 0.1 Private _DecimalPlaces As Integer = 2 公共属性 DecimalPlaces() As Integer 得到 返回 _DecimalPlaces 结束获取 设置(ByVal 值作为整数) 如果 _DecimalPlaces = 值 那么 返回 万一 _DecimalPlaces = 值 结束集 结束属性 公共属性最大值()作为十进制 得到 返回_最大值 结束获取 设置(ByVal 值作为十进制) _最大值 = 值 结束集 结束属性 _ 公共属性 minimum() 作为十进制 得到 返回 _Minimum 结束获取 设置(ByVal 值作为十进制) _最小值 = 值 结束集 结束属性 _ 公共属性增量()作为十进制 得到 返回_增量 结束获取 设置(ByVal 值作为十进制) _增量 = 值 结束集 结束属性 结束类 公共类 NumericUpDownCell 继承 DataGridViewTextBoxCell 公共子新() ' 使用短日期格式。 Me.Style.Format = "N2" 结束子 公共覆盖 Sub InitializeEditingControl(ByVal rowIndex As Integer, _ ByVal initialFormattedValue 作为对象,_ ByVal dataGridViewCellStyle 作为 DataGridViewCellStyle) ' 将编辑控件的值设置为当前单元格值。 MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, _ 数据网格视图单元格样式) Dim ctl As NumericUpDownEditingControl = _ CType(DataGridView.EditingControl, NumericUpDownEditingControl) RemoveHandler ctl.Enter, AddressOf Me.OnNumericEnter AddHandler ctl.Enter, AddressOf Me.OnNumericEnter ctl.Maximum = CType(Me.DataGridView.Columns(Me.ColumnIndex), NumericUpDownColumn).Maximum ctl.Minimum = CType(Me.DataGridView.Columns(Me.ColumnIndex), NumericUpDownColumn).Minimum ctl.Increment = CType(Me.DataGridView.Columns(Me.ColumnIndex), NumericUpDownColumn).Increment ctl.DecimalPlaces = CType(Me.DataGridView.Columns(Me.ColumnIndex), NumericUpDownColumn).DecimalPlaces ctl.ThousandsSeparator = True ctl.Value = CType(Me.Value, Decimal) 结束子 ''' ''' 处理数字的输入事件 ''' ''' ''' ''' Private Sub OnNumericEnter(ByVal sender As Object, ByVal e As EventArgs) 昏暗控件为 NumericUpDownEditingControl = CType(sender, NumericUpDownEditingControl) 暗淡 strValue As String = control.Value.ToString("N2") control.Select(0, strValue.Length) 结束子 公共覆盖 ReadOnly 属性 EditType() 作为类型 得到 ' 返回 CalendarCell 使用的编辑控件的类型。 返回 GetType(NumericUpDownEditingControl) 结束获取 结束属性 公共覆盖 ReadOnly 属性 ValueType() 作为类型 得到 ' 返回 CalendarCell 包含的值的类型。 返回GetType(十进制) 结束获取 结束属性 公共覆盖 ReadOnly 属性 DefaultNewRowValue() 作为对象 得到 ' 使用当前日期和时间作为默认值。 返回 0 结束获取 结束属性 结束类 类 NumericUpDownEditingControl 继承 NumericUpDown 实现 IDataGridViewEditingControl 私有 dataGridViewControl 作为 DataGridView 私有 valueIsChanged As Boolean = False 私有 rowIndexNum 作为整数 公共子新() 结束子 公共属性 EditingControlFormattedValue() As Object _ 实现 IDataGridViewEditingControl.EditingControlFormattedValue 得到 返回 Me.Value.ToString("N2") 结束获取 设置(ByVal 值作为对象) 如果 TypeOf 值为十进制,则 Me.Value = Decimal.Parse(value) 万一 结束集 结束属性 _ 公共函数 GetEditingControlFormattedValue(ByVal 上下文 _ 作为 DataGridViewDataErrorContexts) 作为对象 _ 实现 IDataGridViewEditingControl.GetEditingControlFormattedValue 返回 Me.Value.ToString("N2") 结束功能 公共子 ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As _ DataGridViewCellStyle) _ 实现 IDataGridViewEditingControl.ApplyCellStyleToEditingControl Me.Font = dataGridViewCellStyle.Font Me.ForeColor = dataGridViewCellStyle.ForeColor Me.BackColor = dataGridViewCellStyle.BackColor 结束子 公共属性 EditingControlRowIndex() As Integer _ 实现 IDataGridViewEditingControl.EditingControlRowIndex 得到 返回行索引号 结束获取 设置(ByVal 值作为整数) rowIndexNum = 值 结束集 结束属性 Public Function EditingControlWantsInputKey(ByVal key As Keys, _ ByVal dataGridViewWantsInputKey As Boolean) As Boolean _ 实现 IDataGridViewEditingControl.EditingControlWantsInputKey ' 让 DateTimePicker 处理列出的键。 选择 Case 键和 Keys.KeyCode 'Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _ ' Keys.Home、Keys.End、Keys.PageDown、Keys.PageUp Case Keys.Up, Keys.Down 返回真 其他情况 返回假 结束选择 结束功能 公共子 PrepareEditingControlForEdit(ByVal selectAll As Boolean) _ 实现 IDataGridViewEditingControl.PrepareEditingControlForEdit '不需要做任何准备。 结束子 公共只读属性 RepositionEditingControlOnValueChange() _ 作为布尔实现_ IDataGridViewEditingControl.RepositionEditingControlOnValueChange 得到 返回假 结束获取 结束属性 公共属性 EditingControlDataGridView() As DataGridView _ 实现 IDataGridViewEditingControl.EditingControlDataGridView 得到 返回数据GridViewControl 结束获取 设置(ByVal 值作为 DataGridView) dataGridViewControl = 值 结束集 结束属性 公共属性 EditingControlValueChanged() As Boolean _ 实现 IDataGridViewEditingControl.EditingControlValueChanged 得到 返回值IsChanged 结束获取 设置(ByVal 值作为布尔值) valueIsChanged = 价值 结束集 结束属性 公共只读属性 EditingControlCursor() As Cursor _ 实现 IDataGridViewEditingControl.EditingPanelCursor 得到 返回 MyBase.Cursor 结束获取 结束属性 Protected Overrides Sub OnValueChanged(ByVal eventargs As EventArgs) ' 通知 DataGridView 单元格的内容已更改。 valueIsChanged = 真 Me.EditingControlDataGridView.NotifyCurrentCellDirty(True) MyBase.OnValueChanged(eventargs) 结束子 结束类【问题讨论】:
这就是 NumericUpDown 的工作原理。even when decimal places is set to 2 and increment is .1
尤其是当允许使用小数时,用户可以在使用 KB 而不是箭头时键入小数。硬编码Value.ToString("N2")
可能是一个错误,这将忽略用户在单元格样式中设置的任何值,如果它是非小数,则在输出中显示一个可能会造成混淆
这是在 2 个地方完成的。你指的是哪个?问题是,当我输入一个句点时,它不会显示在编辑控件中。就好像我没有打字一样。我将尝试删除该“ToString(“N2”)”的两次出现。当我输入时,句号仍然没有显示。
我无法重现 - 它让我可以输入小数点。但它也不会保存对设置的更改。如果我更改小数或最小值,最大值它仅使用您的默认值。你忘了序列化它们
是的,它仍在开发中。一旦我弄清楚我的月经问题,我会为其添加序列化。
还有什么可能导致这种情况呢?我在表单上测试了一个标准的 NumericUpDown(它实际上是一个复杂的 UserControl),它接受了“。”。我会调试它,但我不知道从哪里开始。 UserControl 有 2 个使用不同网格的选项卡。具有此列的网格是 UserControl 的新网格,并且具有绑定的列。我使用自定义列两次。一个是绑定的,另一个不是。我将只使用那一列创建一个带有网格的测试表单,看看这种行为是否会消失。
【参考方案1】:
我使用了一个老程序员的技巧来解决这个问题。我刚刚从 Plutonix 引用的帖子中下载了示例代码,并将它附带的 DLL 添加到我的项目中。这项工作很好,并为我省去了很多我没有寻找的麻烦。
【讨论】:
以上是关于自定义 datagridview 列控件将不接受句点 (.)的主要内容,如果未能解决你的问题,请参考以下文章
如何设计WinForm中DataGridView控件的自定义按钮列
添加列的自定义 WinForms DataGridView 问题
DataGridView里怎么增加自定义的CheckBox控件