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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по TexBox, Tab 
V
    Опции темы
timich
Дата 12.2.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем! Такой вопрос. На форме расположил 20 текстовых боксов. Как сделать так чтобы во время работы программы для перехода от одного текстбокса к следующему не нужно было ничего нажимать, то есть не нужно нажимать Tab , а просто после ввода двузначного числа активным становился следующий тексбокс. 
PM MAIL   Вверх
Pilger
Дата 12.2.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В обработчике события изменения текста в текстовом поле (TextChanged) добавляешь проверку на текст (длину или прочее) и даешь фокус другому текстовому полю (TextBox.Focus). Если их много, то можно их засунуть в Array и привязать одно событие.

Это сообщение отредактировал(а) Pilger - 12.2.2009, 15:44


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
timich
Дата 12.2.2009, 23:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если можно, на примере. Как должен выглядеть код, в какой части лучше его расположить.
PM MAIL   Вверх
Pilger
Дата 13.2.2009, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну я ж говорю... ну вот простенький пример для одного текстового поля
Код

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        'Значение TextBox1 изменилось

        If TextBox1.Text.Length > 1 Then    'если длина текста больше 1
            TextBox2.Focus()                'то передаем фокус на TextBox2
        End If
    End Sub


Это сообщение отредактировал(а) Pilger - 13.2.2009, 01:39


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
timich
Дата 13.2.2009, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Во класс)) Я новичок просто)
Осваиваю
Спасибо!
А как будет для двадцати текстбоксов?
Ну я понимаю, что можно для каждого бокса прописать также))), а как можно короче?

Это сообщение отредактировал(а) timich - 13.2.2009, 03:50
PM MAIL   Вверх
Pilger
Дата 13.2.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Примерно так же, как вот и тут есть...
http://forum.vingrad.ru/forum/topic-222125.html

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


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 14.2.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Выкладываю пример. Там для всех текстбоксов назначен один обработчик. Сделано это прямо в дизайнере, для этого надо выделить первый текстбокс, а потом, удерживая шифт выделить остальные. В таблице свойств перейти на вкладку событий и для события TextChanged написать имя обработчика. В коде для поиска следующего текстбокса используется табулятор( то есть: следующим будет тот, который следующий по табулятору). Такая схема работает, когда все бокы размещены в одном контейнере(в данном случае TableLayoytPanel).

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  TBTab.rar 55,56 Kb


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


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


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

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



Да, ещё: Иф там проверяет, что введены действительно две цифры, кроме того, я ограничил максимальную длину текста двумя символами.

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


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


Новичок



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

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



diadiavova, нет слов))
как всегда исчерпывающий ответ.
большое спасибо!
PM MAIL   Вверх
timich
Дата 21.2.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста что в этом коде не верно((

Код

Public Class Form1
    Dim МасПоле() As TextBox = {Nothing, Поле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}
 Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Поле1.TextChanged, Поле2.TextChanged, Поле3.TextChanged, Поле4.TextChanged, Поле5.TextChanged, Поле6.TextChanged, Поле7.TextChanged, Поле8.TextChanged, Поле9.TextChanged, Поле10.TextChanged, Поле11.TextChanged, Поле12.TextChanged, Поле13.TextChanged, Поле14.TextChanged, Поле15.TextChanged, Поле16.TextChanged, Поле17.TextChanged, Поле18.TextChanged, Поле19.TextChanged, Поле20.TextChanged, Поле21.TextChanged, Поле22.TextChanged, Поле23.TextChanged, Поле24.TextChanged, Поле25.TextChanged, Поле26.TextChanged, Поле27.TextChanged, Поле28.TextChanged
        For i As Integer = 1 To 20
            If МасПоле(i).Text.Length > 1 Then
                For j As Integer = 1 To 20
                    If МасПоле(j).Enabled = True Then
                        МасПоле(j).Focus()
                    End If
                Next
            End If
        Next
 End Sub
End Class


Это сообщение отредактировал(а) timich - 21.2.2009, 03:43
PM MAIL   Вверх
diadiavova
Дата 21.2.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А то, что текстбоксов 28 а цикл обходит только 20...это так и было задумано?

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

Подробнее можно написать, если опишешь, что твой код должен делать(если конечно ворпос не адресован телепатам  smile ). 


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


Новичок



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

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



Цитата

Подробнее можно написать, если опишешь, что твой код должен делать(если конечно ворпос не адресован телепатам  smile ). 

 smile 

Есть массив из 28 текстбоксов. Все они должны принимать двузначное число и переводить фокус на следующий.
Некоторые из первых двадцати, во время работы программы, могут быть неактивны (Enabled = False) и при передачи фокуса их нужно перепрыгивать.
В программе перед вводом чисел будет нажиматься кнопка СБРОС. Я написал код для кнопки СБРОС в котором задаются неактивные текстовые поля(каждый раз разные), там же напишу операторы которые будут устанавливать фокус на первый активный тексбокс из первых двадцати. 
Массив я использовал для удобства. И для дальнейшей обработки введенных чисел программой. Хотя может массив и не обязателен...


ФФФух! Вроде бы все описал  smile  smile 


PM MAIL   Вверх
diadiavova
Дата 21.2.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Попробуй так.
Код

Public Class Form1
    Dim МасПоле() As TextBox = {Nothing, Поле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}
 Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Поле1.TextChanged, Поле2.TextChanged, Поле3.TextChanged, Поле4.TextChanged, Поле5.TextChanged,  _
 Поле6.TextChanged, Поле7.TextChanged, Поле8.TextChanged, Поле9.TextChanged, Поле10.TextChanged, _ 
Поле11.TextChanged, Поле12.TextChanged, Поле13.TextChanged, Поле14.TextChanged, Поле15.TextChanged, _
 Поле16.TextChanged, Поле17.TextChanged, Поле18.TextChanged, Поле19.TextChanged, Поле20.TextChanged, _ 
Поле21.TextChanged, Поле22.TextChanged, Поле23.TextChanged, Поле24.TextChanged, Поле25.TextChanged, _ 
Поле26.TextChanged, Поле27.TextChanged
     Dim sr As TextBox = CType( sender, TextBox)
     Dim counter As Integer = Array.IndexOf(МасПоле, sr)
     While(counter<27)
         counter += 1
         If МасПоле(counter).Enabled Then
               МасПоле(counter).Focus()
               End Sub
         End If

     End While
       
 End Sub
End Class


Проверь в работе( мог ошибиться).

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


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


Новичок



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

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



Когда стартую программу выскакивает окно InvalidOperationException was unhandled 
и сообщает 
An error occurred creating the form. See Exception.InnerException for details.  The error is: Object reference not set to an instance of an object.
То же самое было и с моим кодом(( Что это такое?? 
Запустил по шагово, это сообщение выскакивает на операторе  If МасПоле(counter).Enabled Then

PM MAIL   Вверх
diadiavova
Дата 21.2.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А у тебя все текстбоксы инициированы? Такое обычно бывает, когда обращаешься к пустой переменной. 
И ещё: а чем тебе не подошёл тот вариант, который я выложил вначеле?


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


Новичок



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

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



Вроде бы инициированы все...
А твой вариант вполне подошел бы, просто я не смог его доделать под себя(((((
Если можно доделай его))
Блин, мне уже стыдно, столько времени уделяешь smile 
Чтобы мы, чайники, делали...
PM MAIL   Вверх
diadiavova
Дата 21.2.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



По-моему так
Код

Public Class Form1
 
 Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Поле1.TextChanged, Поле2.TextChanged, Поле3.TextChanged, Поле4.TextChanged, Поле5.TextChanged,  _
 Поле6.TextChanged, Поле7.TextChanged, Поле8.TextChanged, Поле9.TextChanged, Поле10.TextChanged, _ 
Поле11.TextChanged, Поле12.TextChanged, Поле13.TextChanged, Поле14.TextChanged, Поле15.TextChanged, _
 Поле16.TextChanged, Поле17.TextChanged, Поле18.TextChanged, Поле19.TextChanged, Поле20.TextChanged, _ 
Поле21.TextChanged, Поле22.TextChanged, Поле23.TextChanged, Поле24.TextChanged, Поле25.TextChanged, _ 
Поле26.TextChanged, Поле27.TextChanged
     Dim sr As TextBox = CType( sender, TextBox)
     sr.Parent.GetNextControl(sr, true).Focus()       
 End Sub
End Class


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


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


Новичок



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

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



То же самое сообщение появляется.
В чем же дело блин...
PM MAIL   Вверх
diadiavova
Дата 22.2.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Тогда выложи проект(или его часть), надо смотреть.

Добавлено через 2 минуты и 49 секунд
Кстати: последний вариант сработает, если все текстбоксы расположены в одном контейнере.


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


Новичок



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

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



Вот фрагмент.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  WindowsApplication2.rar 73,63 Kb
PM MAIL   Вверх
diadiavova
Дата 22.2.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Простейшим способом решения проблемы является вот такой код
Код

Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Поле1.TextChanged, Поле2.TextChanged, Поле3.TextChanged, Поле4.TextChanged, Поле5.TextChanged, _
Поле6.TextChanged, Поле7.TextChanged, Поле8.TextChanged, Поле9.TextChanged, Поле10.TextChanged, _
Поле11.TextChanged, Поле12.TextChanged, Поле13.TextChanged, Поле14.TextChanged, Поле15.TextChanged, _
Поле16.TextChanged, Поле17.TextChanged, Поле18.TextChanged, Поле19.TextChanged, Поле20.TextChanged, _
Поле21.TextChanged, Поле22.TextChanged, Поле23.TextChanged, Поле24.TextChanged, Поле25.TextChanged, _
Поле26.TextChanged, Поле27.TextChanged
        Dim sr As TextBox = CType(sender, TextBox)
        Try
            Dim nextBox = sr.Parent.GetNextControl(sr, True).Focus
        Catch
        End Try
    End Sub


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

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

        'Поле1
        '
        Me.Поле1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(204, Byte))
        Me.Поле1.Location = New System.Drawing.Point(12, 12)
        Me.Поле1.MaxLength = 2
        Me.Поле1.Name = "Поле1"
        Me.Поле1.Size = New System.Drawing.Size(23, 20)
        Me.Поле1.TabIndex = 29
        Me.Поле1.Text = "0"
        Me.Поле1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
        '
        'Поле2
        '
        Me.Поле2.Location = New System.Drawing.Point(12, 42)
        Me.Поле2.MaxLength = 2
        Me.Поле2.Name = "Поле2"
        Me.Поле2.Size = New System.Drawing.Size(23, 20)
        Me.Поле2.TabIndex = 30
        Me.Поле2.Text = "0"
        Me.Поле2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center

'**********************************************************************************
'остальной код
'************************************************************************************
        Me.Controls.Add(Me.Поле1)
        Me.Controls.Add(Me.Поле2)
'**********************************************************************************
'остальной код
'************************************************************************************


Обрати внимание: сначала инициируются свойства, а потом контрол добавляется на форму. Когда свойству Text элемента Поле1 ты присваеваешь значение инициируется событие TextChanged этого элемента. В обработчике события ты обращаешься к свойству Parent этого элемента, но пока он не добавлен в коллекцию Controls формы это свойство у него равно Nothing и любое обращение к нему приводит к исключению. 
Кроме того: поиск следующего текстбокса в данной ситуации приведёт к тому же эффекту(он ещё не создан).
То есть ошибку этот код вызывает по одному разу для каждого контрола(во время инициализации)
Первый способ обойти эту неприятность я уже представил. Что можно сделать ещё...
Код

Public Class Form1


    Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim sr As TextBox = CType(sender, TextBox)
        Dim nextBox = sr.Parent.GetNextControl(sr, True).Focus
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        For Each c As Control In Me.Controls
            If TypeOf c Is TextBox AndAlso c IsNot Поле28 Then
                Dim tb As TextBox = CType(c, TextBox)
                AddHandler c.TextChanged, AddressOf TextBoxes_TextChanged
            End If
        Next
    End Sub
End Class



Что мы делаем вданном случае?
По событию Load формы(то есть кода всё уже инициировано) перебираем размещённые на ней контролы, и если контрол является текстбоксом и не является последним из них(с него некуда переводить фокус), то каждому такому текстбоксу назначаем обработчика события TextChanged. Если боксы расплоложены не на форме а в другом контейнере, то обходить надо контролы контейнера.

ЗЫ
Постарайся разобраться в коде, а не копипастить.


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


Новичок



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

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



Перевариваю уже сутки...
Действительно, если не понять код, то проще просто заказать то что нужно...
А изучаем для того чтоб сами писали проги...
Кое что ясно, кое что нет...

Продолжаю изучать...

Добавлено через 2 минуты и 55 секунд
diadiavova, расскажи плиз, если можно,  немного про CType, доступно.
PM MAIL   Вверх
diadiavova
Дата 24.2.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(timich @  23.2.2009,  22:34 Найти цитируемый пост)
расскажи плиз, если можно,  немного про CType, доступно.

http://msdn.microsoft.com/ru-ru/library/4x2877xb.aspx
Как доступно - не знаю, но опишу на приведённом примере.

Цитата(diadiavova @  22.2.2009,  21:54 Найти цитируемый пост)

Код

        For Each c As Control In Me.Controls
            If TypeOf c Is TextBox AndAlso c IsNot Поле28 Then
                Dim tb As TextBox = CType(c, TextBox)
                AddHandler c.TextChanged, AddressOf TextBoxes_TextChanged
            End If
        Next


Здесь в цикле перебираются все контролы расположенные на форме. Коллекция Controls содержит элементы типа Control. Этот тип является базовым для всех элементов управленя, то есть элементом данной коллекции может быть любой контрол. Проблема в том, что внутри цикла мы подписываем обработчика событию TextChanged, а у класса Control такого события нет. Событие это есть у текстбокса(который тоже является контролом), поэтому мы проверяем тип переменной с и если это текстбокс, то прежде чем подписывать обработчика события сначала надо преобразовать к типу TextBox, кстати в коде ошибка, которую компилятор проглотил, но для точности вместо
Код

AddHandler c.TextChanged, AddressOf TextBoxes_TextChanged

надо писать
Код

AddHandler tb.TextChanged, AddressOf TextBoxes_TextChanged

Переменная tb имеет тип TextBox а не Control(как с).

Неправильный вариант сработал потому, что по-умолчанию в проектах VB отключена опция Option&nbsp;Strict. Благодаря этому можно было написать такой код
Код

Dim tb As TextBox = c

и компилятор проглотил бы(наверное) не смотря не несоответствие типов. Во всех подобных случаях CType вызывается неявно. Иногда, даже при отключеной Option&nbsp;Strict всё равно требуется явное приведение типов. В любом случае: лучше делать это явно.

Ещё: преобразование проходит без ошибок, потому что предварительно проверяется тип контрола. если на форму кинуть что-то ещё(кнопку, например) и попробовать в таком случае преобразовать контрол в текстбокс(не проверяя тип предварительно) - вылезет ошибка. Здесь принцип  такой: всё, что на форме - контролы, но при преобразовании надо учитывать какой именно конрол ты обрабатываешь в конкретном случае.

Вроде объяснил. smile 

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


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


Новичок



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

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



Спасибо! smile 
Теперь все работает.
Вот последний вариант кода

Код

Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Поле1.TextChanged, Поле2.TextChanged, Поле3.TextChanged, Поле4.TextChanged, Поле5.TextChanged, _
Поле6.TextChanged, Поле7.TextChanged, Поле8.TextChanged, Поле9.TextChanged, Поле10.TextChanged, _
Поле11.TextChanged, Поле12.TextChanged, Поле13.TextChanged, Поле14.TextChanged, Поле15.TextChanged, _
Поле16.TextChanged, Поле17.TextChanged, Поле18.TextChanged, Поле19.TextChanged, Поле20.TextChanged, _
Поле21.TextChanged, Поле22.TextChanged, Поле23.TextChanged, Поле24.TextChanged, Поле25.TextChanged, _
Поле26.TextChanged, Поле27.TextChanged
        Dim sr As TextBox = CType(sender, TextBox)
        Try
            If sr.Text.Length > 1 Then
                Dim nextBox = sr.Parent.GetNextControl(sr, True).Focus()
            End If
        Catch
        End Try
    End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each c As Control In Me.Controls
            If TypeOf c Is TextBox AndAlso c IsNot Поле28 Then
                Dim tb As TextBox = CType(c, TextBox)
                AddHandler tb.TextChanged, AddressOf TextBoxes_TextChanged
            End If
        Next
    End Sub


Правда он работает только если все тексбоксы на панели лежат. Если просто на форме, то нет. Но это не важно.
И пришлось добавить строку 
Код

 If sr.Text.Length > 1 Then

 End If


Еще пара вопросов и тему можно будет закрыть smile 

1. Как же сделать так чтобы перепрыгивать текстбокс, Enabled которого равен False?
2. Что такое Parent? Или, еще лучше, что означает строка   Dim nextBox = sr.Parent.GetNextControl(sr, True).Focus()
3. Где можно читать разъяснение элементарных вещей? Например что такое пространство имен??? Ведь не представляя себе четко такие вещи, вряд ли можно продвинуться в чем то более серьезном... MSDN конечно хорошо, но для самоучки сложноватые объяснения однако...
Может стоит создать тему по таким детским вопросам по VB.Net??? Будет ли кто нибудь отвечать на такие вопросы??? smile  smile  smile 
PM MAIL   Вверх
diadiavova
Дата 24.2.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
что означает строка   Dim nextBox = sr.Parent.GetNextControl(sr, True).Focus()

Эта строка появилась в моём коде из-за того, что я предлагая разные варианты решения, просто копипастил предыдущий вариант и вносил в него изменения(кое что недоглядел)
Код

 Dim nextBox = sr.Parent.GetNextControl(sr, True)


а потом
Код

nextBox.Focus()

Так будет правильнее.

Теперь по существу дела.
В последнем варианте ты (извини) обосрал всё, что я предложил перед этим.
Варианты предложенные перед этим не предполагали, что ты будешь их объединять. Предпочтительнм является второй вариант, а первый я написал в силу того, что он подразумевал небольшую коррекцию кода. Конструкция Try...Catch предназначена для обработки исключительных ситуаций и использовать её в логике программы нежелательно(разве что, в крайних случаях). 
Для подписки обработчика события в васике существует две конструкции:
1. Использование Handles в декларации самого обработчика.
2. Использование AddHandler в коде. 
Ты используешь оба варианта....зачем? Чем тебя это не устроило?
Код

Public Class Form1
    Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim sr As TextBox = CType(sender, TextBox)
        Dim nextBox = sr.Parent.GetNextControl(sr, True)
        nextBox.Focus()
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        For Each c As Control In Me.Controls
            If TypeOf c Is TextBox AndAlso c IsNot Поле28 Then
                Dim tb As TextBox = CType(c, TextBox)
                AddHandler c.TextChanged, AddressOf TextBoxes_TextChanged
            End If
        Next
    End Sub
End Class


Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
И пришлось добавить строку


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

Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
1. Как же сделать так чтобы перепрыгивать текстбокс, Enabled которого равен False?

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

Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
2. Что такое Parent?

Парент - это контрол, на котором расположен данный контрол. Если контрол лежит на форме, то парентом для него является форма, а если на панели - панель.

Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
3. Где можно читать разъяснение элементарных вещей?

мсдн, книги, статьи.
В сети очень много материалов. В основном надо искать по платформе .Net(а не по языку).

Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
пространство имен?

Всего лишь средство для логического распределения типов. С их помощью типы, предназначенные для одних целей размещаются в одном месте(пространстве). Полное имя типя включает в себя пространство имён. Но если в код импортировать некоторые пространства, то имена типов можно писать без имени пространства имён.
Пример: класс для работы с изображениями называется System.Drawing.Image причём System.Drawing здесь пространство имён. Но если в код импортировать это пространство, то можно писать просто Image
К мсдн надо привыкнуть. Чем больше знаешь, тем понятнее всё становится.


Цитата(timich @  24.2.2009,  18:40 Найти цитируемый пост)
Может стоит создать тему по таким детским вопросам по VB.Net??? Будет ли кто нибудь отвечать на такие вопросы???

Здесь есть форум .Net для новичков. В заголовочной части этого форума есть тема Ламерские вопросы.
А язык изучить не сложно. 



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


Новичок



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

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



diadiavova, напиши пожалуйста в этом примере как все должно выглядеть на самом деле.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  WindowsApplication3.rar 78,62 Kb
PM MAIL   Вверх
diadiavova
Дата 25.2.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я сначала переделал твой код, а потом, когда увидел, что от первоначального варианта почти ничего не осталось, решил сделать другую форму. Оба варианта работают, но первый - неудачный.

Несколько комментариев по коду:
конструкция 
Код

If TextBox1.Enabled = True Then
TextBox1.Enabled = False
Else
TextBox1.Enabled = True
End If

эквивалентна следующему коду
Код

TextBox1.Enabled = Тще TextBox1.Enabled

Это работает для всех булевых свойств.

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

В моём примере я применил TableLayoutPanel. Код сделал таким, что он одинаково работоспособен при любом количестве строк столбцов и текстбоксов. Адаптировать его к другим условиям - тоже не проблема. И , даже, если надо сделать собственный контрол с такой функциональностью, но настраиваемый, то мои коды в нём можно использовать почти без изменений.

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

Всестороннего тестирования не проводил, но вроде работает как надо.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  WindowsApplication3.rar 102,45 Kb


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


Новичок



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

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



Класс!!
Только почему то с цифровой клавиатуры цифры не вводятся, только с основной.

Цитата

код VB.NET
1:TextBox1.Enabled = Тще TextBox1.Enabled

Тще это Not?


PM MAIL   Вверх
diadiavova
Дата 25.2.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(timich @  25.2.2009,  18:36 Найти цитируемый пост)
Тще это Not?

Естесственно.

Насчёт клавиатуры потом посмотрю, пока попробуй NumLock переключить


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


Новичок



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

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



NumLock включен smile  smile  smile 
PM MAIL   Вверх
timich
Дата 27.2.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну, господа, вопрос считаем решенным.
Спасибо всем кто принял участие, особенно дядевове!   smile 
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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