.NET 4.x DataGridViewNumericColumn не принимает значение в последней строке с 1 раза - Visual Basic .NET
Формулировка задачи:
Гуру vb.net помогите разобраться.
Нужна была удобная колонка для ввода суммы, нашел на просторах интернета этот вариант:
Проблема такая, если в Datagridview строка не последняя, то введенное значение принимается и отображается в ячейке, если строка последняя значение вроде как принимается и строка новая создается (DatagridView c параметром AllowUserToAddRows=True) но не отображается, отображается только после повторного ввода.
Как сделать чтобы в последней строке введенное значение сразу отображалось?
Листинг программы
- Public Class DataGridViewNumericColumn
- Inherits DataGridViewColumn
- Public Sub New()
- MyBase.New(New NumericUpDownCell())
- End Sub
- Public Overrides Property CellTemplate() As DataGridViewCell
- Get
- Return MyBase.CellTemplate
- End Get
- Set(ByVal value As DataGridViewCell)
- ' Ensure that the cell used for the template is a CalendarCell.
- If Not (value Is Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(NumericUpDownCell)) Then
- Throw New InvalidCastException("Must be a NumericUpDownCell")
- End If
- MyBase.CellTemplate = value
- End Set
- End Property
- End Class
- Public Class NumericUpDownCell
- Inherits DataGridViewTextBoxCell
- Public Sub New()
- ' Use the short date format.
- ' Me.Style.Format = "#.##"
- End Sub
- Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
- ' Set the value of the editing control to the current cell value.
- MyBase.InitializeEditingControl(rowIndex, Me.Value, dataGridViewCellStyle) 'initialFormattedValue
- Dim ctl As NumericUpDownEditingControl = CType(DataGridView.EditingControl, NumericUpDownEditingControl)
- ctl.Value = 0.00
- Select Case dataGridViewCellStyle.Format
- Case "n0"
- ctl.DecimalPlaces = 0
- Case "n1"
- ctl.DecimalPlaces = 1
- Case "n2", "c2"
- ctl.DecimalPlaces = 2
- End Select
- If Not Me.Value Is DBNull.Value Then
- If Not Me.Value Is Nothing Then
- ctl.Value = Me.Value
- End If
- End If
- End Sub
- Public Overrides ReadOnly Property EditType() As Type
- Get
- ' Return the type of the editing contol that CalendarCell uses.
- Return GetType(NumericUpDownEditingControl)
- End Get
- End Property
- Public Overrides ReadOnly Property ValueType() As Type
- Get
- ' Return the type of the value that CalendarCell contains.
- Return GetType(Decimal)
- End Get
- End Property
- Public Overrides ReadOnly Property DefaultNewRowValue() As Object
- Get
- ' Use the current date and time as the default value.
- Return Nothing
- End Get
- End Property
- End Class
- Class NumericUpDownEditingControl
- Inherits NumericUpDown
- Implements IDataGridViewEditingControl
- Private dataGridViewControl As DataGridView
- Private valueIsChanged As Boolean = False
- Private rowIndexNum As Integer
- Public Sub New()
- Me.DecimalPlaces = 2
- Minimum = 0
- Maximum = 9999999999
- Value = 0.00
- End Sub
- Public Property EditingControlFormattedValue() As Object Implements IDataGridViewEditingControl.EditingControlFormattedValue
- Get
- Return Me.Value.ToString '("#.##")
- End Get
- Set(ByVal value As Object)
- If TypeOf value Is Decimal Then
- Me.Value = Decimal.Parse(value.ToString)
- End If
- End Set
- End Property
- Public Function GetEditingControlFormattedValue(ByVal context As DataGridViewDataErrorContexts) As Object Implements IDataGridViewEditingControl.GetEditingControlFormattedValue
- Return Me.Value.ToString '("#.##")
- End Function
- Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
- Me.Font = dataGridViewCellStyle.Font
- Me.ForeColor = dataGridViewCellStyle.ForeColor
- Me.BackColor = dataGridViewCellStyle.BackColor
- End Sub
- Public Property EditingControlRowIndex() As Integer Implements IDataGridViewEditingControl.EditingControlRowIndex
- Get
- Return rowIndexNum
- End Get
- Set(ByVal value As Integer)
- rowIndexNum = value
- End Set
- End Property
- Public Function EditingControlWantsInputKey(ByVal key As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements IDataGridViewEditingControl.EditingControlWantsInputKey
- ' Let the DateTimePicker handle the keys listed.
- Select Case key And Keys.KeyCode
- Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp
- Return True
- Case Else
- Return False
- End Select
- End Function
- Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
- ' No preparation needs to be done.
- End Sub
- Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange
- Get
- Return False
- End Get
- End Property
- Public Property EditingControlDataGridView() As DataGridView Implements IDataGridViewEditingControl.EditingControlDataGridView
- Get
- Return dataGridViewControl
- End Get
- Set(ByVal value As DataGridView)
- dataGridViewControl = value
- End Set
- End Property
- Public Property EditingControlValueChanged() As Boolean Implements IDataGridViewEditingControl.EditingControlValueChanged
- Get
- Return valueIsChanged
- End Get
- Set(ByVal value As Boolean)
- valueIsChanged = True 'value
- End Set
- End Property
- Public ReadOnly Property EditingControlCursor() As Cursor Implements IDataGridViewEditingControl.EditingPanelCursor
- Get
- Return MyBase.Cursor
- End Get
- End Property
- Protected Overrides Sub OnValueChanged(ByVal eventargs As EventArgs)
- ' Notify the DataGridView that the contents of the cell have changed.
- valueIsChanged = True
- Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
- MyBase.OnValueChanged(eventargs)
- End Sub
- End Class
Решение задачи: «.NET 4.x DataGridViewNumericColumn не принимает значение в последней строке с 1 раза»
textual
Листинг программы
- Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
- ' No preparation needs to be done.
- SendKeys.Send("{UP}") 'меняем значение на 1 вверх
- SendKeys.Send("{DOWN}") ' вниз
- SendKeys.Send("+{RIGHT}") ' выделяем первый 0
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д