Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic .NET

Войти
Регистрация
Восстановить пароль
 
alexs_43
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 19
#1

.NET 4.x DataGridViewNumericColumn не принимает значение в последней строке с 1 раза - Visual Basic .NET

15.03.2017, 10:30. Просмотров 194. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос .NET 4.x DataGridViewNumericColumn не принимает значение в последней строке с 1 раза (Visual Basic .NET):

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

Найти максимум в первой строке матрице и в последней строке матрицы - Pascal ABC
Ввести двумерный массив A (NxM) , вывести его. Найти максимум в первой строке матрице и в последней строке матрицы. На большее из этих...

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

Найти значение аргумента, при котором функция принимает минимальное значение - Visual Basic
найти значение аргумента, при котором функция y=exp(-2*x)*cos(x) принимает минимальное значение в точках интервала от 0 до 4, расположенных...

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

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

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

никто не работал с custom column?
0
Orlangur1991
611 / 600 / 136
Регистрация: 28.11.2014
Сообщений: 1,030
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
611 / 600 / 136
Регистрация: 28.11.2014
Сообщений: 1,030
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
Привет! Вот еще темы с ответами:

Найдите с точностью 0,0001 значение x, при котором функция f(x) принимает минимальное значение - C#
Найдите с точностью 0,0001 значение x, при котором функция f(x) принимает минимальное значение: f(x)= x/(1+x^2 ) на отрезке . Результат...

Рассчитать значения функции. Определить значение х, при котором функция принимает минимальное значение - MS Excel
вот сама задача: На новом листе рассчитать значения функции для х от 2 до 4 через каждые 0,2. Определить такое значение х из числа...

Найти и вывести все значения аргумента x, при которых значение функции y принимает чётное значение - PascalABC.NET
Дана функция y=f(x,a). Найти и вывести все значения аргумента x, при которых значение функции y принимает чётное значение. x - через цикл...

Найти среднее арифметическое элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу. - Turbo Pascal
Дан двумерный массив размером n*m, заполненный случайными числами. Найти среднее арифметическое элементов, принадлежащих первой строке,...


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

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

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