Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
alexs_43
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 19
#1

DataGridViewNumericColumn не принимает значение в последней строке с 1 раза

15.03.2017, 10:30. Просмотров 214. Ответов 5

Гуру vb.net помогите разобраться.

Нужна была удобная колонка для ввода суммы, нашел на просторах интернета этот вариант:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
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
Проблема такая, если в Datagridview строка не последняя, то введенное значение принимается и отображается в ячейке, если строка последняя значение вроде как принимается и строка новая создается (DatagridView c параметром AllowUserToAddRows=True) но не отображается, отображается только после повторного ввода.

Как сделать чтобы в последней строке введенное значение сразу отображалось?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2017, 10:30
Ответы с готовыми решениями:

В заданной матрицы K (6,4) найти наибольшее значение в последней строке
Помогите.В заданной матрицы K (6,4) найти наибольшее значение в последней...

Найти максимум в первой строке матрице и в последней строке матрицы
Ввести двумерный массив A (NxM) , вывести его. Найти максимум в первой строке...

Вставить в строке знак «!» после символов, принадлежащих множеству и встречающихся в строке 2 раза
3)Дана строка и множество символов. Вставить в строке знак «!» после символов,...

Найти элементы в строке двухмерного массива которые встречаются в данной строке более одного раза
В i-й строке двумерного массива найти и вывести в ОДНОЙ (!) строке - элементы,...

Определить, сколько чисел принимает наименьшее значение и каково это значение
Наптсат программу, обеспечивающий, ввод n целых чисел и определяющий, сколько...

5
alexs_43
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 19
16.03.2017, 12:04  [ТС] #2
Ну кто-нибудь,

никто не работал с custom column?
0
Orlangur1991
1046 / 980 / 239
Регистрация: 28.11.2014
Сообщений: 1,529
16.03.2017, 12:54 #3
alexs_43, Так а требуется что? Просто столбец, в котором будет возможен ввод только числа? Тогда, я думаю, проще так сделать
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        RemoveHandler e.Control.KeyPress, AddressOf Column1_KeyPress
        If DataGridView1.CurrentCell.ColumnIndex = 0 Then 'Индекс целевого столбца
            Dim tb As TextBox = TryCast(e.Control, TextBox)
            If tb IsNot Nothing Then
                AddHandler tb.KeyPress, AddressOf Column1_KeyPress
            End If
        End If
    End Sub
 
    Private Sub Column1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles DataGridView1.KeyPress
        If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) Then
            e.Handled = True
        End If
    End Sub
Добавлено через 7 минут
Проверил класс DataGridViewNumericColumn, тоже все работает
1
alexs_43
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 19
16.03.2017, 13:31  [ТС] #4
ваш вариант рабочий, но нужен был функционал NumeriUpDown с стрелочками.

понять проблему по описанию трудно согласен, поэтому сделал скрины с моими действиями (проблема на рисунке №3)

файл прикрепил
0
Миниатюры
DataGridViewNumericColumn не принимает значение в последней строке с 1 раза  
Orlangur1991
1046 / 980 / 239
Регистрация: 28.11.2014
Сообщений: 1,529
16.03.2017, 14:20 #5
alexs_43, проблему понял, но как решить нормальным способом не знаю Могу предложить колхозный вариант типа заменить
vb.net
1
2
3
  Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
        ' No preparation needs to be done.
    End Sub
на
vb.net
1
2
3
4
5
6
  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
Почему-то, если вводить цифры с клавиатуры, а затем принимать это изменение Enter'ом, то строка не считается как редактируемая
1
alexs_43
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 19
16.03.2017, 15:12  [ТС] #6
Orlangur1991, спасибо огромное, про сендкейс что-то не вспомнил, грязный "хак" конечно, но всё же работает.

А так оставляю вопрос открытым, вдруг кто знает как обойтись меньшим злом.
0
16.03.2017, 15:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2017, 15:12

Найти значение аргумента, при котором функция принимает минимальное значение
найти значение аргумента, при котором функция y=exp(-2*x)*cos(x) принимает...

Вывести на экран значение t при котором функция x(t) принимает максимальное значение
Объясните, как решить с помощью массива. Только начал изучать C++. Знаю, как...

Найдите с точностью 0,0001 значение x, при котором функция f(x) принимает минимальное значение
Найдите с точностью 0,0001 значение x, при котором функция f(x) принимает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru