Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
.NET 4.x

Enter вместо Tab при работе с Datagridview

12.12.2012, 00:18. Показов 2729. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я программирую в .NET недавно.
Мне надо добавить одну запись и заполнить данные в гриде. Юзеры не хотят пользоваться табулятором, а хотят нажимать Enter. Вот что у меня получилось:

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
     Private Sub frmCMCaseIndexes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AnswerStr = ""
        DisplayAll()
        If AnswerStr <> "" Then
            Me.Close()
        End If
    End Sub
 
    Sub DisplayAll()
        SqlStatement = "Select dk_key AS 'CASE #', item_no As 'ITEM #', p_d As 'P/D', atty AS 'ATTY', "
        SqlStatement &= "index_date As 'FILED', index_desc As 'CASE INDEX DESCRIPTION' From "
        SqlStatement &= CaseIndexTable & " Where dk_key = '" & CaseNo & "' Order By index_date"
        Dim sqlConn As SqlConnection = New SqlConnection(connStringCM)
        sqlConn.Open()
        Dim sqlCom As SqlCommand = New SqlCommand(SqlStatement, sqlConn)
        Dim dr As SqlDataReader = sqlCom.ExecuteReader
        Dim dt As DataTable = New DataTable
        dt.Load(dr)
        DataGridView1.DataSource = dt
        dt.Dispose()
        dr.Dispose()
        sqlCom.Dispose()
        sqlConn.Dispose()
        'MessageBox.Show(DataGridView1.RowCount.ToString)
        DataGridView1.Columns(0).Width = 70
        DataGridView1.Columns(1).Width = 75
        DataGridView1.Columns(2).Width = 45
        DataGridView1.Columns(3).Width = 60
        DataGridView1.Columns(4).Width = 70
        DataGridView1.Columns(5).Width = 420
        DataGridView1.Columns(0).ReadOnly = True
        DataGridView1.Columns(1).ReadOnly = True
        DataGridView1.Columns(2).ReadOnly = True
        DataGridView1.Columns(3).ReadOnly = True
        DataGridView1.Columns(4).ReadOnly = True
        'DataGridView1.Columns(3).DefaultCellStyle.Format = 
    End Sub
 
    Private Sub cmdAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdAdd.Click
        AddMode = True
        SqlStatement = "Insert into " & CaseIndexTable & "(dk_key, index_date) Values ('"
        SqlStatement &= CaseNo & "', '" & Today & "')"
        connAdapterCM.SelectCommand.CommandText = SqlStatement
        connAdapterCM.SelectCommand.ExecuteNonQuery()
        DisplayAll()
        DataGridView1.Columns(2).ReadOnly = False
        DataGridView1.Columns(3).ReadOnly = False
        DataGridView1.Columns(4).ReadOnly = False
        Rowindex = DataGridView1.RowCount - 2
        DataGridView1.CurrentCell = DataGridView1.Rows(Rowindex).Cells(2)
        DataGridView1.Focus()
    End Sub
 
 
    Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim ri As Integer = DataGridView1.CurrentCell.RowIndex
            Dim ci As Integer = DataGridView1.CurrentCell.ColumnIndex
 
            e.SuppressKeyPress = True
            If DataGridView1.Columns.Count > ci + 1 Then
                DataGridView1.CurrentCell = DataGridView1.Rows(ri).Cells(ci + 1)
                Exit Sub
            Else
                DataGridView1.CurrentCell = DataGridView1.Rows(ri + 1).Cells(5)
            End If
        End If
 
    End Sub
Программа добавляет новую запись и останавливается на новой строке в нужной колонке.
Если я нажимаю Enter, курсор движется вдоль строки, без проблем. Но стоит мне ввести любую информацию, а затем нажать Enter, курсор перескакивает на следующую строку.
Я уже прогуглил сотню форумов, но ничего подходящего не нашёл. Может быть, у кого-то есть решение?
Заранее весьма признателен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.12.2012, 00:18
Ответы с готовыми решениями:

Enter вместо Tab
HI АLL Не подскажет ли кто где ошибка? У меня он в Text1 печатает текст Tab. Или может, кто подскажет, как сделать так чтобы...

Tab вместо Enter (FireFox)
Хотелось бы реализовать на JS следующие возможности (в рамках формы): 1. Клавиша Enter отвечает за табуляцию (вместо Tab). 2....

Переход к следующему элементу по нажатии Enter вместо Tab
Доброго времени суток. Существует форма с большим количеством текстбоксов и комбобоксов. Требуется последовательно переключаться между...

12
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
12.12.2012, 11:45
отлавливал нажатие клавиш в ячейке следующим образом:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Private Sub dgvParts_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvParts.EditingControlShowing
        If dgvParts.CurrentCell.ColumnIndex = 5 Then
            Dim textBoxCell As TextBox = CType(e.Control, TextBox)
            AddHandler textBoxCell.KeyPress, AddressOf textBoxCell_KeyPress
            AddHandler textBoxCell.KeyDown, AddressOf textBoxCell_KeyDown
        End If
    End Sub
    Private Sub textBoxCell_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If dgvParts.CurrentCell.ColumnIndex = 5 Then
            If Char.IsNumber(e.KeyChar) = True Or e.KeyChar = ChrW(Keys.Back) Then
                e.Handled = False
            Else
                MessageBox.Show("Ошибка! Поле 'Цена' должно содержать число.", "Ошибка!")
                e.Handled = True
            End If
        End If
    End Sub
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
12.12.2012, 16:40  [ТС]
Спасибо за ответ. А какой Sub будет для textBoxCell_KeyDown?
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
12.12.2012, 21:01
эмм...
VB.NET
1
2
3
Private Sub textBoxCell_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
      'Ваш код при нажатии Enter
End Sub
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
12.12.2012, 21:43  [ТС]
Этот Sub срабатывает и тогда, когда я пытаюсь ввести в клетку любые данные (скажем, инициалы). Как определить, какая клавиша была нажата? e.KeyChar в KeyDown не работает, то есть, я не могу написать
If e.KeyChar = ChrW(13) Then
................
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
12.12.2012, 22:01
Так сделай если твое окно активно и нажата кнопка то выполнить.

Добавлено через 24 секунды
Через GetAsyncKeyState.

Добавлено через 13 минут
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
Imports System.Runtime.InteropServices
 
Public Class Form1
 
    <DllImport("user32.dll")> _
    Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    End Function
    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function GetForegroundWindow() As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, _
                          ByRef lpdwProcessId As Integer) As Integer
    End Function
 
    'Проверяет активно ли окно.
    Private Function ActiveApp() As Boolean
        Dim RunnungAppProcessID As UInteger = 0
        Dim CurrentProcessID As UInteger = 0
        Dim HWND As IntPtr
        Dim HWNDWindow As IntPtr
 
        HWNDWindow = GetForegroundWindow()
        HWND = Me.Handle
        GetWindowThreadProcessId(HWND, RunnungAppProcessID)
        GetWindowThreadProcessId(GetForegroundWindow(), CurrentProcessID)
        If RunnungAppProcessID = CurrentProcessID Then
            Return True
        Else
            Return False
        End If
    End Function
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Ну проверять я буду в таймере а ты уж по своему).
        If ActiveApp() = True Then
            If GetAsyncKeyState(Keys.Enter) <> 0 Then
                MsgBox("Вы нажали Enter.")
            End If
        End If
    End Sub
 
End Class
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
12.12.2012, 22:11  [ТС]
Спасибо, попробую разобраться...
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
13.12.2012, 09:15
мм... то есть

VB.NET
1
2
3
if e.keychar = Keys.Enter then
     '...
End If
не прокатывает?
ЗЫ: в KeyPress, естественно...

Добавлено через 51 минуту
или как вариант:
VB.NET
1
2
3
4
5
Private Sub textBoxCell_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Enter Then
 
        End If
    End Sub
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
13.12.2012, 16:06  [ТС]
Спасибо, я уже так и сделал.
К сожалению, коды, котые Вы мне дали, тоже не работают. Как я сказал в самом начале, если я просто нажимаю Enter, курсор переходит на следующую колонку. Но стоит мне ввести какие-то данные, - после нажатия Enter он прыгает на следующую строку.
Последний выполняемый метод - _CellEndEdit Я попробовал поставить свои коды туда, но и они не работают:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
  Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        If DataGridView1.CurrentCell.ColumnIndex = 3 Then
            DataGridView1.Rows(e.RowIndex).Cells(3).Value = DataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString.ToUpper
            Dim ri As Integer = DataGridView1.CurrentCell.RowIndex
            Dim ci As Integer = DataGridView1.CurrentCell.ColumnIndex
 
            ' Пытаюсь вернуться на старую строку
             If DataGridView1.Columns.Count > ci + 1 Then
                DataGridView1.CurrentCell = DataGridView1.Rows(ri - 1).Cells(ci + 1)
                Exit Sub
            End If
         End If
    End Sub
Причём, что интересно, он перемещается на соседнюю колонку (что мне и надо), но при этом опускается на следующую строку (чего мне не надо).
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
13.12.2012, 21:34
может быть это поможет - вот что пишут буржуи:

When DataGridCell is in Edit mode, you press the key "Enter", it will not fire the events like KeyPress/KeyDown. So, what we can do is creating a new DataGridView, and then add KeyPress Event. Please check the following sample code:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public NotInheritable Class MyDataGridView
   Inherits DataGridView
 
 Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
   If keyData = Keys.Enter Then
  Me.OnKeyPress(New KeyPressEventArgs("r"c))
  Return True
   Else
  Return MyBase.ProcessCmdKey(msg, keyData)
   End If
 End Function
  End Class   
 
 Private Sub myDataGridView1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
        If e.KeyChar = "r"c Then
            Dim dgv As DataGridView = TryCast(sender, DataGridView)
            Dim cell As DataGridViewCell = dgv.CurrentCell
            If cell.IsInEditMode Then
                ' event to fire
            End If
        End If
    End Sub               ' using this code in the form with the new DataGridView you created
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
13.12.2012, 21:44  [ТС]
Спасибо!
Я этот материал видел, но пытался найти другой путь, поскольку пока ещё не умею создавать новый класс. Наверное, всё-таки, придётся пойти этим путём: надо же когда-то начинать учить новое (хотя для меня пока что всё - новое) .
Огромное спасибо Вам за все Ваши ответы!
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
14.12.2012, 10:24
в аттаче проектик, накидал на скорую руку: при редактировании ячейки, если нажимаешь Enter появляется messagebox.
Вложения
Тип файла: zip WindowsApplication2.zip (107.5 Кб, 27 просмотров)
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 14
17.12.2012, 19:07  [ТС]
Я всё "буржуйское" прочитал в разных форумах. Опять-таки, большинство из них предлагают создать новый класс (в Вашем примере, "with the new DataGridView you created")...
Ещё раз - спасибо и с наступающим Новым годом!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2012, 19:07
Помогаю со студенческими работами здесь

Переход между полями при нажатии ENTER, также как по TAB?
Есть форма с несколькими полями. У каждого поля есть Tab-индекс, т.е. порядок, в котором будет меняться фокус при нажатии клавиши TAB. Я...

При нажатии ENTER не срабатывало нажатие кнопки, на которой в данный момент стоит TAB
Ребята, помогите кто-нибудь, у меня на форме 16 кнопок, и когда нажимаю клавишу ENTER срабатывает нажатие кнопки, на которой стоит...

При переходе по TAB пропадает свойство Tag со всех строк DataGridView
Добрый день Происходит что-то непонятное. В главной форме находится элемент TabControl с двумя табами. На каждом из Таб находится...

Как можно заблокировать нажатие клавиши Enter при работе в Memo?
Есть поле Memo который я использую для ввода данных, так как у Edit нет возможности выравнивания по центру. Вопрос следующий. Когда...

Использовать данные из ячейки datagridview при нажатии Enter
Добрый день. Есть грид с колонками. При двойном клике мышкой на ячейке все работает (в данном случае выводит текст из ячейки в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru