Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: TreeView - как словить событие? Добавлено: 18.04.06 16:23  

Автор вопроса:  Ruslan
Всем доброго дня!

Столкнулся со следующей проблемой. Когда произвожу редактирования узла дерева в TreeView пытаюсь отлавливать нажатие кнопок по событию KeyDown и ничего не происходит. Если нажимать кнопки когда не редактируется ни один узел TreeView, но само TreeView активно, то событие KeyDown работает, только приступаю к редактированию какой-либо Nod-ы, всё - событие не работает.

Подскажите чайнику в чём здесь подвох.

Спасибо за любую помощь!

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 18.04.06 17:23
Для этих целей лучше использовать события:
-BeforeLabelEdit (наступает перед редактирование нода)
-AfterLabelEdit (наступает соответственно после)
В этих события в качестве параметра передается
ByVal e As System.Windows.Forms.NodeLabelEditEventArgs

а в нем есть следующее:
        e.CancelEdit
        e.Label
        e.Node

К сожалению TreeNode событий не имеет, поэтому предусмотрены эти события у родителя..

Ответить

Номер ответа: 2
Автор ответа:
 Ruslan



Вопросов: 5
Ответов: 11
 Профиль | | #2 Добавлено: 18.04.06 18:16
Спасибо за ответ! Естественно я использую эти события! Но такое интересное событие для меня как e.CancelEdit возвращает всегда False, независимо от того нажал я Enter или Esc. А мне нужно, чтобы при нажатии Esc шёл откат всех действий, вот я и пытаюсь словить это нажатие. А как иначе сделать, если пользователь стал редактировать Nod-у, а потом передумал и решил отказаться от изменений?

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 18.04.06 18:59
А надо просто ничего не делать, и всё будет именно так...

Ответить

Номер ответа: 4
Автор ответа:
 Ruslan



Вопросов: 5
Ответов: 11
 Профиль | | #4 Добавлено: 18.04.06 19:24
Нет! Дело в том, что у меня по событию After select срабатывают определённые функции, это если пользователь провёл какие-то изменения, идёт обращение к БД и т.д., а если он нажимает Esc, тоесть не хочет делать никаких изменений - опять идёт обращение к After select и вот там мне нужно понять, что он отказался от изменений. Как это сделать? e.CanselEdit всегда выдаёт False, не важно что он сделал, произвёл редактирование или отказался от него, всё равно False. А мне нужно словить момент, когда он нажал Esc, тоесть другими словами вернуть всё в прежнее состояние.
Как это сделать? Спасибо!

Вот этот код:
Private Sub ДеревоГруппыТовара_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles ДеревоГруппыТовара.AfterLabelEdit
        ;Dim КомандаБазеДанных As New SqlClient.SqlCommand
        ;Dim ПараметрыХП As SqlClient.SqlParameter
        If e.Label = "" Then
            MessageBox.Show("Выполните изменения!";)
            e.Node.BeginEdit()
            Exit Sub
        End If
        КомандаБазеДанных.CommandType = CommandType.StoredProcedure
        КомандаБазеДанных.Connection = ПодключениеКБазеДанных
        Select Case Действие
            Case "Добавить группу"
                КомандаБазеДанных.CommandText = "ХП_ДобавлениеГруппыТовара"
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@ГруппаТовара", e.Label)
                ПараметрыХП.Direction = ParameterDirection.Input
                ПараметрыХП.SqlDbType = SqlDbType.NVarChar
                If ДеревоГруппыТовара.SelectedNode.Parent Is Nothing Then
                    ПараметрыХП = КомандаБазеДанных.Parameters.Add("@КодРодителя", System.DBNull.Value)
                    ПараметрыХП.Direction = ParameterDirection.Input
                    ПараметрыХП.SqlDbType = SqlDbType.Int
                Else
                    ПараметрыХП = КомандаБазеДанных.Parameters.Add("@КодРодителя", ДеревоГруппыТовара.SelectedNode.Parent.Tag)
                    ПараметрыХП.Direction = ParameterDirection.Input
                    ПараметрыХП.SqlDbType = SqlDbType.Int
                End If
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@КодЗаписи", Nothing)
                ПараметрыХП.Direction = ParameterDirection.Output
                ПараметрыХП.SqlDbType = SqlDbType.Int
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@СообщениеВыполнения", Nothing)
                ПараметрыХП.Direction = ParameterDirection.Output
                ПараметрыХП.Size = 64
                ПараметрыХП.SqlDbType = SqlDbType.NVarChar
                Try
                    КомандаБазеДанных.ExecuteNonQuery()
                Catch ex As Exception
                    MessageBox.Show("Ошибка при выполнении хранимой процедуры 'ХП_ДобавлениеГруппыТовара'! Обратитесь к разработчику", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    e.Node.BeginEdit()
                    Exit Try
                Finally
                    If КомандаБазеДанных.Parameters("@СообщениеВыполнения";).Value = "" Then
                        ДеревоГруппыТовара.SelectedNode.Text = e.Label
                        ДеревоГруппыТовара.SelectedNode.Tag = КомандаБазеДанных.Parameters("@КодЗаписи";).Value
                        ДеревоГруппыТовара.LabelEdit = False
                        Действие = ""
                    Else
                        MessageBox.Show(КомандаБазеДанных.Parameters("@СообщениеВыполнения";).Value, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        ДеревоГруппыТовара.SelectedNode.Text = e.Label
                        e.Node.BeginEdit()
                    End If
                End Try
            Case "Изменить группу"
                КомандаБазеДанных.CommandText = "ХП_ИзменениеГруппыТовара"
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@ГруппаТовара", e.Label)
                ПараметрыХП.Direction = ParameterDirection.Input
                ПараметрыХП.SqlDbType = SqlDbType.NVarChar
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@КодЗаписи", Me.ДеревоГруппыТовара.SelectedNode.Tag)
                ПараметрыХП.Direction = ParameterDirection.Input
                ПараметрыХП.SqlDbType = SqlDbType.Int
                ПараметрыХП = КомандаБазеДанных.Parameters.Add("@СообщениеВыполнения", Nothing)
                ПараметрыХП.Direction = ParameterDirection.Output
                ПараметрыХП.Size = 128
                ПараметрыХП.SqlDbType = SqlDbType.NVarChar
                Try
                    КомандаБазеДанных.ExecuteNonQuery()
                Catch ex As Exception
                    MessageBox.Show("Ошибка при выполнении хранимой процедуры 'ХП_ИзменениеГруппыТовара'! Обратитесь к разработчику", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    e.Node.BeginEdit()
                    Exit Try
                Finally
                    If КомандаБазеДанных.Parameters("@СообщениеВыполнения";).Value = "" Then
                        ДеревоГруппыТовара.SelectedNode.Text = e.Label
                        ДеревоГруппыТовара.LabelEdit = False
                        Действие = ""
                    Else
                        MessageBox.Show(КомандаБазеДанных.Parameters("@СообщениеВыполнения";).Value, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        ДеревоГруппыТовара.SelectedNode.Text = e.Label
                        e.Node.BeginEdit()
                    End If
                End Try
        End Select
End Sub

Тоесть, если он не произведёт никаких изменений - всё равно событие его вернёт к редактированию, в коде это видно в первых строчках. Как обойти?

Ответить

Номер ответа: 5
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #5
Добавлено: 18.04.06 21:40
Если ты хочешь отменить переименование:
e.canceledit=true

Ответить

Номер ответа: 6
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #6
Добавлено: 18.04.06 21:43
а если хочешь именно по Esc, то ставь KeyPreview у формы и лови там.
Наверное...

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 18.04.06 21:46
e.CanselEdit всегда выдаёт False

Ты немного недопонимаешь.. это свойство служит для других целей..
Например, если ты присвоишь e.CanselEdit = True в событии AfterLabelEdit,то именения в ноде будут отменены, т.е. вернуться к к моменту начала редактирования нода.. Это в основном используется для проверки вводимых значений.. например юзер ввел в название недопустимые симоволы, то код мог выглядеть так:
         If e.Label.IndexOfAny(New Char() {"@", ".", ",", "!"}) = -1 Then
            e.CanselEdit = True
         End If

Боюсь, что отловить KeyDown в момент Node. IsEditing тебе не удастся..

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 18.04.06 21:47
а если хочешь именно по Esc, то ставь KeyPreview у формы и лови там.

Нифига... не ловится... я проверял

Ответить

Номер ответа: 9
Автор ответа:
 Ruslan



Вопросов: 5
Ответов: 11
 Профиль | | #9 Добавлено: 19.04.06 10:17
Так что же делать? Не хочется как-то через диалог Ok/Отмена, слишком уж горбато...

Ответить

Номер ответа: 10
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #10
Добавлено: 19.04.06 11:10
А так нельзя?
    Dim lastkey As Keys

    Private Sub TreeView1_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles TreeView1.AfterLabelEdit
        If lastkey = Keys.Escape Then
            e.CancelEdit = True
        End If
    End Sub

    Private Sub TreeView1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles TreeView1.PreviewKeyDown
        Debug.WriteLine(e.KeyCode)
        lastkey = e.KeyCode
    End Sub

Ответить

Номер ответа: 11
Автор ответа:
 Ruslan



Вопросов: 5
Ответов: 11
 Профиль | | #11 Добавлено: 19.04.06 11:25
А у меня нету TreeView1.PreviewKeyDown такого собия. Использую VB.NET 2003. Может где какую ссылку на библиотеку не добавил?

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 19.04.06 12:51
    Private Sub TreeView1_PreviewKeyDown(ByVal sender As Object, ByVal e As PreviewKeyDownEventArgs) Handles TreeView1.PreviewKeyDown
        If e.KeyCode = Keys.Escape Then
            If TreeView1.SelectedNode.IsEditing Then
                TreeView1.SelectedNode.EndEdit(True)
            End If
        End If
    End Sub

Ответить

Номер ответа: 13
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #13 Добавлено: 19.04.06 12:54
Note: This event is new in the .NET Framework version 2.0.

увы.. в 2003 студии нет PreviewKeyDown... :-(

Ответить

Номер ответа: 14
Автор ответа:
 Ruslan



Вопросов: 5
Ответов: 11
 Профиль | | #14 Добавлено: 19.04.06 13:08
Короче выкрутился я вот таким способом:

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
-----------------------------------------
        If GetKeyState(System.Windows.Forms.Keys.Escape) >= 0 Then
                'Блок отмены редактирования'
        End If

Ответить

Номер ответа: 15
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #15 Добавлено: 19.04.06 13:23
Отстойно.

Если e.label is nothing, редактирование отменили.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам