Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальное копирование\вставка в буфер обмена, Копирование вставка 
V
    Опции темы
omankit
  Дата 13.10.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



 smile  smile Здравствуйте помогите разобреться с такой вещью! Есть приложение для бд где все формы основаны на одной базовой (inherited). Нужно организовать копирование вставку хотя бы из textbox контролов для начала.

Что я уже накопал:
Код

'В базовой форме пишем данный код
Private Sub BaseChildForm_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    'захватываем для копирования в буфер
    If e.KeyCode = Keys.C AndAlso e.Control Then
        Dim i As Integer
            For i = 0 To My.Application.OpenForms.Count - 1
                If My.Application.OpenForms.Item(i).ContainsFocus Then
                    For Each ctl As Control In Me.DataSplitContainer.Panel2.Controls
                        If TypeOf ctl Is TextBox And Not ctl.Text = "" Then
                            My.Computer.Clipboard.SetText(ctl.Text)
                        End If
                End If
    End If
    'захватываем для вставки из буфера
    If e.KeyCode = Keys.V AndAlso e.Control Then
        Dim i As Integer
            For i = 0 To My.Application.OpenForms.Count - 1
                If My.Application.OpenForms.Item(i).ContainsFocus Then
                    For Each ctl As Control In Me.DataSplitContainer.Panel2.Controls
                        If TypeOf ctl Is TextBox Then
                            ctl.Text = My.Computer.Clipboard.GetText
                        End If
                End If
    End If
End Sub

!!!!!!!!!!!!!!!!!!!!!!??????????????????
А теперь самое интересное если на форме добавить какой нибудь контейнер (tabconteiner,panel,tablelayout и т.п.)
то ничего не работает этот код видит только данный контейнер и чтобы выловить контрол надо перебирать все его содержимое. а если контейнеры вложены друг в друга надо перебирать сначало один потом вложеный и т.д и т.п.
Вопрос как это обойти! не хочется писать оброботчик в каждой форме
 smile  smile 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

ИТОГОВЫЙ КОД ОТВЕТ!!!!!!!!!!!

Код


   Public Sub FillKeyUpSubToControls(ByVal ctl As Control)
        For Each con As Control In ctl.Controls
            If TypeOf con Is TextBox Then
                Dim tb As TextBox = CType(con, TextBox)
                AddHandler tb.KeyUp, AddressOf ControlKeyApp
            ElseIf con.Controls.Count > 0 Then
                FillKeyUpSubToControls(con)
            End If
        Next
  End Sub

    Public Sub ControlKeyApp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        If TypeOf sender Is TextBox Then
            Dim ActiveTextBox As TextBox = CType(sender, TextBox)
            If e.KeyCode = Keys.C AndAlso e.Control Then
                My.Computer.Clipboard.SetText(ActiveTextBox.SelectedText)
            End If
            If e.KeyCode = Keys.V AndAlso e.Control Then
                ActiveTextBox.SelectedText = My.Computer.Clipboard.GetText
            End If
        End If
    End Sub





Это сообщение отредактировал(а) omankit - 29.10.2008, 12:13
PM MAIL ICQ   Вверх
omankit
Дата 16.10.2008, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Очень жалко что ни кто не может ответить smile 
PM MAIL ICQ   Вверх
MasterOfCode
Дата 16.10.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Windows должна по стандарту копировать текст на Ctrl + C


--------------------
user posted image
PM ICQ   Вверх
diadiavova
Дата 16.10.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(omankit @  16.10.2008,  08:32 Найти цитируемый пост)
Очень жалко что ни кто не может ответить

На самом деле вопрос не вполне ясен. Для начала неплохо было бы выяснить для чего нужно перебирать все открытые формы. Дело в том, что о событии KeyUp написано буквально следующее
Цитата

Occurs when a key is released while the control has focus.

Учитывая, что событие возникает не само по себе, а для конкретного объекта, то если вызван обработчик события, то и так ясно, что активна именно та форма для которой он сработал. Таким образом для начала надо урезать код хотябы до такого

Код

'В базовой форме пишем данный код
Private Sub BaseChildForm_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    'захватываем для копирования в буфер
    If e.KeyCode = Keys.C AndAlso e.Control Then
                    For Each ctl As Control In Me.DataSplitContainer.Panel2.Controls
                        If TypeOf ctl Is TextBox And Not ctl.Text = "" Then
                            My.Computer.Clipboard.SetText(ctl.Text)
                        End If
                    Next
    End If
    'захватываем для вставки из буфера
    If e.KeyCode = Keys.V AndAlso e.Control Then
                    For Each ctl As Control In Me.DataSplitContainer.Panel2.Controls
                        If TypeOf ctl Is TextBox Then
                            ctl.Text = My.Computer.Clipboard.GetText
                        End If
                    Next
     End If
End Sub

Хотя, кто знает, возможно я чего-то не понял.
Теперь к проблеме
Замечание 
Цитата(MasterOfCode @  16.10.2008,  08:56 Найти цитируемый пост)
Windows должна по стандарту копировать текст на Ctrl + C 

в данном случае довольно уместно, правда немного с другого боку. Обрати внимание на то, как копирование производит система. При нажатии Ctrl + C копируется не абы какой текст, а конкретно выделенный текст активного текстбокса. Ты, как я понимаю хочешь скопировать весь текст из текстбокса. Это можно, только надо определиться с какого именно. Что происходит у тебя в коде? перебираются контролы на заданной панели и если это текстбокс, его содержимое копируется в буфер. Проблема только в том сколько текстбоксов на этой панели. Если их больше одного, то принахождении первого его текст будет скопирован, но цикл при этом не остановится, далее будет найден следующий текстбокс, и его текст тоже будет скопирован(полагаю излишне объяснять, что текст, скопированный перед этим будет удалён) и  конце концов в буфере останется только текст из последнего текстбокса. Так что сначала определись, что именно ты хочешь копировать. Хотя... возможно я чего-то не понял.

Это сообщение отредактировал(а) diadiavova - 16.10.2008, 14:30


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
mihryak
Дата 16.10.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



omankit, я был был раздосадован, если на ctrl-c в буфер бы скопировался не так старательно мною выделенный текст, а текст целиком, причём из какого-то левого текст-бокса
есть общеупотребительные приёмы работы, и когда некая программа на стандартные действия реагирует совсем нестандартно - это всегда плохо и раздражает не только меня одного
PM MAIL ICQ   Вверх
diadiavova
Дата 19.10.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ну, коль скоро разъяснений по поводу того, что должен делать этот код не последовало прийдётся описывать задачу, исходя из того, что я понял.
Насколько я понял задача заключается в том, чтобы "лёгким движением руки" можно было скопировать текст изо всех текстбоксов и так же легко его вставить, к тому же, что бы он правильно распределился, да ещё и реализовать это всё в базовом классе и ктому же, чтобы всё работало одинаково хорошо для всех производных классов.
Если это так - попытаюсь объяснить почему это невозможно в общем случае. 
Допустим ты производишь от данного класса ещё два к примеру A и B. В классе А три текстбокса, в классе В - два (или четыре - всё равно). Скопировали данные из экземпляра класса А и пытаемся вставить в экземпляр класса В. И что куда вставлять?

Поэтому 
1.Не нужно использовать буфер обмена. Вместо этого нужно реализовать такой механизм в котором обмен данными будет осуществляться только внутри одного класса. Если в системный буфер нужно заносить данные - делать это отдельно.
2.Часть работы прийдётся выполнять в каждом классе, но в базовом можно реализовать несколько инструментов, которые помогут сделать это быстро.

Ещё момент. Вот это замечание 
Цитата(mihryak @  16.10.2008,  12:55 Найти цитируемый пост)
есть общеупотребительные приёмы работы, и когда некая программа на стандартные действия реагирует совсем нестандартно - это всегда плохо и раздражает не только меня одного 

не догма. В некоторых случаях переопределять системную логику нужно, но для этого нужны серьёзные основания и к тому же нужно учитывать все последствия. Так что если логика программы позволяет сохранить общепринятые правила - лучше так и поступить.

Горячие клавиши являются способом быстрого вызова команд, но для каждой команды должен быть определён стандартный вызов, то есть какое-нибудь меню. Так вот: горячие клавиши лучше назначать для элементов меню для этого у класса System.Windows.Forms.ToolStripMenuItem есть свойство ShortcutKeys, которому можно присвоить значение прямо в дизайнере, вместо того, чтобы обрабатывать события клавиатуры.

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

Так же в базовой форме можно предусмотреть методы копирования и вставки данных. Я тут примерно набросал что можно сделать, код не проверял, но если нигде не ошибся - должен работать.

Код

Public MustInherit Class BaseForm
    Inherits Form
    '  Коллекция для обхода при копировании
    Dim TextBoxList As New List(Of TextBox)
    'Метод, рекурсивно обходящий все контролы определённого контейнера и вложенных контейнеров
    'и добавляющий все текстбоксы в коллекцию 
    'Второй параметр указывает следует ли предварительно очистить коллекцию
    Protected Sub FillTextBoxList(ByVal container As ContainerControl, Optional ByVal clearList As Boolean = True)
        If clearList Then
            TextBoxList.Clear()
        End If
        For Each Con As Control In container.Controls
            If TypeOf Con Is TextBox Then
                TextBoxList.Add(CType(Con, TextBox))
            ElseIf TypeOf Con Is ContainerControl Then
                FillTextBoxList(CType(Con, ContainerControl), False)
            End If
        Next
    End Sub
    'Обходит все текстбоксы коллекции и возвращает их содержимое в виде строкового массива
    Protected Function GetTextData() As String()
        Dim rv(TextBoxList.Count - 1) As String
        For i As Integer = 0 To TextBoxList.Count - 1
            rv(i) = TextBoxList(i).Text
        Next
        Return rv
    End Function
    'Принимает строковый массив и если количество элементов в нём совпадает с количеством текстбоксов
    'вставляет текст из массива в текстбоксы, в ином случае инициируется исключение
    Protected Sub SetTextData(ByVal data() As String)
        If data.Length <> TextBoxList.Count Then
            Dim ex As New Exception("Количество вставляемых записей не соответствует количеству текстовых полей")
            Throw ex
        Else
            For i As Integer = 0 To data.Length - 1
                TextBoxList(i).Text = data(i)
            Next
        End If
    End Sub
End Class


Метод FillTextBoxList следует вызвать создания списка текстбоксов. Сделать это можно в обработчике события Load базовой формы или в конструкторе производной формы, но после инициализации компонентов(последний вариант может создать небольшие проблемы в сучае если от той формы будет ещё что-то производится, хотя и  это не страшно).

Для копирования внутри класса лучше всего создать статическое поле. 
Вот примерный шаблон того, что можно сделать в производном классе.

Код

Public Class ChildForm
    Inherits BaseForm

    Public Sub New()
        InitializeComponent()
        Me.FillTextBoxList(Me.DataSplitContainer.Panel2)
    End Sub
    Private Shared Buffer() As String

    Sub CopyToBuffer()
        Buffer = Me.GetTextData
    End Sub

    Sub PasteFromBuffer()
        If Buffer IsNot Nothing Then
            Me.SetTextData(Buffer)
        End If
    End Sub
End Class


Ну а что до способов вызова методов копирования и вставки - здесь всё ограничивается только твоей фантазией.

Кроме того очень рекомендую при вставке предусмотреть возможность отмены вставки(Undo) хотябы на один ход. Для этого просто нужно создать ещё одно поле - строковый массив(не статический) и копировать в него данные перед вставкой. Потомучто если что-то случайно вставишь не туда - данные будут потеряны. 

ЗЫ
Код не проверял, так что если будут глюки и сам не разберёшься - пиши.

Это сообщение отредактировал(а) diadiavova - 19.10.2008, 22:33


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
omankit
Дата 20.10.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Ну да форма то известна сразу. Проблема в основном в том что я не могу получить контрол активный. По значению activecontrol мне выдается контейнер!!! А что дальше то делать как контрол получить из которого послали KeyUp? Переберать все контейнеры ища активный контрол через EditingControl? Да и в коллекции контролов видно только контейнер! Приходится выбирать его брать сплитпанел2 например и перебирать коллекцию контролов этой панели! Самое плохое что эти контейнеры различаются от формы к форме! smile. diadiavova спасибо smile  smile  smile собственно не обязательно весь текст и  текст бокс. Главное контрол найти из базового класса а потом уже определить что за контрол и в зависимости от типа произвести копирование/вставку в определенное свойство. Спасибо за пример копирования всего я думаю я до этого еще доберусь.
PM MAIL ICQ   Вверх
MasterOfCode
Дата 20.10.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(omankit @  20.10.2008,  12:45 Найти цитируемый пост)
Главное контрол найти из базового класса а потом уже определить что за контрол и в зависимости от типа произвести копирование/вставку в определенное свойство

Почему бы не подписаться на событие KeyUp у textBox'a тогда не надо определять что за контрол и задача определение активности так же отпадет


--------------------
user posted image
PM ICQ   Вверх
diadiavova
Дата 20.10.2008, 11:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(omankit @  20.10.2008,  09:45 Найти цитируемый пост)
А что дальше то делать как контрол получить из которого послали KeyUp?

Ну здесь как раз всё просто. У обработчика события два параматра. Первый(sender) - как раз ссылка на объект инициировавший событие. Так что, если ты подписан на событие киап самого контрола - то и городушки городить не стоит. А для того, чтобы на него подписаться при обходе текстбоксов надо сделать примерно так
Код

 Protected Sub FillTextBoxList(ByVal container As ContainerControl, Optional ByVal clearList As Boolean = True)
        If clearList Then
            TextBoxList.Clear()
        End If
        For Each Con As Control In container.Controls
            If TypeOf Con Is TextBox Then
                Dim tb As TextBox = CType(Con, TextBox)
                TextBoxList.Add(tb)
                AddHandler tb.KeyUp, AddressOf TextBox_KeyApp
            ElseIf TypeOf Con Is ContainerControl Then
                FillTextBoxList(CType(Con, ContainerControl), False)
            End If
        Next
    End Sub

    Sub TextBox_KeyApp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)
         If TypeOf sender Is TextBox Then
               Dim ActiveTextBox As TextBox = CType(sender, TextBox)
               'здесь обработать текстбокс
         End If
    End Sub


Я тут переделал функцию заполнения коллекции из предыдущего примера, но если тебе это не понадобится просто можешь не добавлять ткстбоксы в коллекцию а только определить обработчик события.

Цитата(omankit @  20.10.2008,  09:45 Найти цитируемый пост)
 Главное контрол найти из базового класса а потом уже определить что за контрол

Метод FillTextBoxList обходит все контролы некоторого контейнера и вложенных в него контейнеров. В этом вся фишка. Ты просто передаёшь ей контейне как аргумент а она его обходит. Можно сделать что-то в таком роде
Код

 Protected Sub WathContainer(ByVal container As ContainerControl)
        For Each Con As Control In container.Controls
            'Проверяем тип Con и выполняем нужную обработку
            If TypeOf Con Is ContainerControl Then
                FillTextBoxList(CType(Con, ContainerControl), False)
            End If
        Next
    End Sub


Можно при желании оформить всё в виде функции, которая будет выдавать линейный список контролов, но делать это в обработчике события не советую. Операция затратная и лишний раз её лучше не выполнять. Лучше всего обойти список по необходимости и всё что нужно добавить в коллекцию и потом пользоваться.


Цитата(omankit @  20.10.2008,  09:45 Найти цитируемый пост)
Самое плохое что эти контейнеры различаются от формы к форме!

Они может и различаются, но имеют общего предка. Я это учёл.

Цитата(omankit @  20.10.2008,  09:45 Найти цитируемый пост)
Спасибо за пример копирования всего я думаю я до этого еще доберусь. 

Ты хоть проверь работает или нет. Это такая штука, что независимо от того, сколько раз ты это делал - всегда лучше испытать код, а я этого не сделал.

Это сообщение отредактировал(а) diadiavova - 20.10.2008, 11:59


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 20.10.2008, 13:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Я извиняюсь в этом коде допустил ошибку
Код

    Protected Sub WatсhContainer(ByVal container As ContainerControl)
        For Each Con As Control In container.Controls
            'Проверяем тип Con и выполняем нужную обработку
            If TypeOf Con Is ContainerControl Then
                FillTextBoxList(CType(Con, ContainerControl), False)
            End If
        Next
    End Sub

Скопировал его с предыдущего примера, поменял имя метода, а внутри самого метода этого не сделал
Я имел в виду это
Код

    Protected Sub WatсhContainer(ByVal container As ContainerControl)
        For Each Con As Control In container.Controls
            'Проверяем тип Con и выполняем нужную обработку
            If TypeOf Con Is ContainerControl Then
                WatсhContainer(CType(Con, ContainerControl))
            End If
        Next
    End Sub


Обход осуществляется рекурсивно, так что метод вызывает сам себя, и второго параметра у него естественно нет.

Это сообщение отредактировал(а) diadiavova - 23.10.2008, 19:45


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
omankit
Дата 20.10.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Хм а SplitterPanel не ловит а она в самом начале smile 

---------------------------
Немного подумав вот что накатал:
Код

  Protected Sub WathContainerCopyPaste(ByVal CurControl As Control, Optional ByVal CopyOrPaste As Integer = 0)
        'If CopyOrPaste = 1 then copy else if CopyOrPaste = 2 then paste 
        Select Case CopyOrPaste
            Case 1
                For Each Con As Control In CurControl.Controls
                    'Проверяем тип Con и выполняем нужную обработку
                    If TypeOf Con Is TextBox Then
                        If Con.Focused = True Then
                            My.Computer.Clipboard.SetText(CType(Con, TextBox).SelectedText)
                        End If
                    End If
                    If TypeOf Con Is ContainerControl Then
                        WathContainerCopyPaste(Con, CopyOrPaste)
                    End If
                    If TypeOf Con Is SplitterPanel Then
                        WathContainerCopyPaste(Con, CopyOrPaste)
                    End If
                Next
            Case 2
                For Each Con As Control In CurControl.Controls
                    'Проверяем тип Con и выполняем нужную обработку
                    If TypeOf Con Is TextBox Then
                        If Con.Focused = True Then
                            CType(Con, TextBox).SelectedText = My.Computer.Clipboard.GetText
                        End If
                    End If
                    If TypeOf Con Is ContainerControl Then
                        WathContainerCopyPaste(Con, CopyOrPaste)
                    End If
                    If TypeOf Con Is SplitterPanel Then
                        WathContainerCopyPaste(Con, CopyOrPaste)
                    End If
                Next
        End Select
    End Sub

    Private Sub BaseChildForm_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
        If e.KeyCode = Keys.C AndAlso e.Control Then
            For Each ctl As Control In CType(sender, Form).Controls
                If TypeOf ctl Is ContainerControl Then
                    WathContainerCopyPaste(ctl, 1)
                End If
            Next
        End If
        If e.KeyCode = Keys.V AndAlso e.Control Then
            For Each ctl As Control In CType(sender, Form).Controls
                If TypeOf ctl Is ContainerControl Then
                    WathContainerCopyPaste(ctl, 2)
                End If
            Next
        End If
    End Sub


diadiavova ОГРОМНОЕ СПАСИБО ЗА ИНТЕРЕСНЫЕ МЫСЛИ И ПОДСКАЗКИ!!!!!!!!

Это сообщение отредактировал(а) omankit - 20.10.2008, 15:17
PM MAIL ICQ   Вверх
diadiavova
Дата 20.10.2008, 16:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(omankit @  20.10.2008,  14:51 Найти цитируемый пост)
Хм а SplitterPanel не ловит а она в самом начале

Я просто не посмотрел на иерархию, положился на память. SplitterPanel действительно не происходит от ContainerControl, вместо него в коде следует использовать System.Windows.Forms.ScrollableControl или вообще можно ограничиться Control, потомучто свойство Controls наследуетса именно от него. В таком виде всё будет ловиться.
Код


    Protected Sub WatchContainer(ByVal container As Control)
        For Each Con As Control In container.Controls
            'Проверяем тип Con и выполняем нужную обработку
            If  Con.Controls.Count > 0 Then
                WatсhContainer(Con)
            End If
        Next
    End Sub


Если ты назначаешь обработчик в коде, то инструкция Handles не нужна. Всё сделал не так как я писал. Если всё работает - это не значит, что код хороший. В таком виде как у тебя всё будет тормозить. Я ведь уже писал, что не следует обходить все контролы при копировании, потомучто рекурсия - дорогое удовольствие. Создай список и обходи его если нужно. Но лучше обрабатывать события самих текстбоксов. Обходишь рекурсивно форму один раз подписываешься не события нужных контролов, а после этого в обработчике идентифицируешь отправителя события по параметру sender.
Сделаешь ещё несколько таких тормозных кодов - с прогой вообще невозможно будет работать.

И ещё раз повторю, что обработка событий клавиатуры для создания шоткатов - плохая идея. Старайся максимально использовать стандартные приёмы. Хотя, если есть желание наступить на эти грабли самому - твоё дело.

 

Это сообщение отредактировал(а) diadiavova - 23.10.2008, 19:44


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
omankit
Дата 23.10.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



а стандартно то как??? как стандартно сделать все это дело? и о каком списке речь? всмысле мне на каждом текстбоксе в каждой форме все делать? как обойти и подписаться?

Добавлено через 1 минуту и 30 секунд
я не понимаю потому что не копирует в буфер по умолчанию да и мышью не выделяет
PM MAIL ICQ   Вверх
diadiavova
Дата 23.10.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Да я ведь несколько сообщений назад привёл пример. Там я как раз обхожу контролы, и если это текст бокс подписываюсь на ег событие(конструкция AddHandler - просмотри тему). Обработчик один для всех текстбоксов. Но в нём проводится обработка сендера(первого параметра).
Вот привожу цитату, клацни по изображению лупы в ней, чтобы прокрутить страницу в нужное место
Цитата(diadiavova @  20.10.2008,  11:55 Найти цитируемый пост)
А для того, чтобы на него подписаться при обходе текстбоксов надо сделать примерно так


ЗЫ
Судя по всему произошло то о чём я написал. Начались тормоза и прочие непредсказуемые явления. Самое хреновое в этом всём, что поначалу таккие проблемы можно и не заметить, а потом всё равно скажутся.

Добавлено через 7 минут и 54 секунды
Не копирует потомучто надо обрабатывать событие того объекта, который тебя интересует()в твоём случае текстбокса. А ты обрабатываешь событие формы. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
omankit
Дата 24.10.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Ну этот глюк с копированием (то что выделить мышью нельзя и буфер сам не работает) уже давно к сожалению не я писал приложение с начала даже не могу представить где это дело слетает. А на счет хендлера попробую в понедельник до меня смысл дошел я и не знал что так можно спасибки.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1253 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.