Страница: 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 (наступает соответственно после)
В этих события в качестве параметра передается
а в нем есть следующее:
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
 im КомандаБазеДанных As New SqlClient.SqlCommand
 im ПараметрыХП 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-сайт:
Профиль | | #5
Добавлено: 18.04.06 21:40
Если ты хочешь отменить переименование:
Номер ответа: 6
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 18.04.06 21:43
а если хочешь именно по Esc, то ставь KeyPreview у формы и лови там.
Наверное...
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 18.04.06 21:46
Ты немного недопонимаешь.. это свойство служит для других целей..
Например, если ты присвоишь e.CanselEdit = True в событии AfterLabelEdit,то именения в ноде будут отменены, т.е. вернуться к к моменту начала редактирования нода.. Это в основном используется для проверки вводимых значений.. например юзер ввел в название недопустимые симоволы, то код мог выглядеть так:
e.CanselEdit = True
End If
Боюсь, что отловить KeyDown в момент Node. IsEditing тебе не удастся..
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 18.04.06 21:47
Нифига... не ловится... я проверял
Номер ответа: 9
Автор ответа:
Ruslan
Вопросов: 5
Ответов: 11
Профиль | | #9
Добавлено: 19.04.06 10:17
Так что же делать? Не хочется как-то через диалог Ok/Отмена, слишком уж горбато...
Номер ответа: 10
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #10
Добавлено: 19.04.06 11:10
А так нельзя?
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
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
увы.. в 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, редактирование отменили.