Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Редактирование элемента combobox в его текстовом окне

20.01.2016, 11:34. Показов 3035. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В какое событие combobox и какой код нужно вставить, чтобы отредактированный текст заменил текст соответствующего элемента combobox. Имеется в виду редактирование текста в текстовом окне самого combobox.
Пробую как в VB-6 Change(TextChanged) ничего не выходит.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2016, 11:34
Ответы с готовыми решениями:

Редактирование элемента в дочернем окне меняет данные в основной коллекции автоматически
Осваиваю паттерн MVVM. Пока делаю попроще, без валидации и шаблонов. Хочу понять суть. Столкнулся с проблемой. В моем случае я...

Создание элемента и его редактирование
Как правильно создать элемент и редактировать его? Например, создаю input внутри div, потом при нажатии на input меняю атрибут...

Изменить отображение элемента после выбора его в ComboBox
Если в программе Total Commander открыть список логических дисков, то на против каждого есть описание. Вот скриншот: После выбора...

14
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.01.2016, 13:11
jkrnd, при выбое элемента, запоминайте его индекс и при изменении значения меняйте то, которое установлено по сохраненному индексу
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
20.01.2016, 13:19  [ТС]
И всё-таки, в какое событие вставлять код обработки
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.01.2016, 14:23
jkrnd, ну например TextChanged или на кнопку, смотря в каком моменте вы бы холели чтобы элемент списка изменит свое название
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
20.01.2016, 15:10  [ТС]
Уточню
Код на VB-6 (в idxCurItem - индекс редактируемого элемента списка cboTitle ( Simple Combobox)):
Visual Basic
1
2
3
4
5
6
Private Sub cboTitle_Change()
  If cboTitle.ListCount > 0 Then
    cboTitle.RemoveItem idxCurItem
    cboTitle.AddItem cboTitle.Text, idxCurItem
  End If
End Sub
здесь всё работает
теперь на VB.NET
VB.NET
1
2
3
4
5
6
Private Sub cboTitle_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboTitle.TextChanged
    If cboTitle.Items.Count > 0 Then
            cboTitle.Items.RemoveAt(idxCurItem)
            cboTitle.Items(idxCurItem) = cboTitle.Text
    End If
End Sub
Даёт ошибку в строке 3 (idxCurItem=0)
"InvalidArgument=Значение '-1' недопустимо для 'index'.
Имя параметра: index"
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.01.2016, 16:14
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
при выбое элемента, запоминайте его индекс и при изменении значения меняйте то, которое установлено по сохраненному индексу
я вам про это говорил....

вот пример рабочий
VB.NET
1
2
3
4
5
6
7
8
9
    Private Sub cboTitle_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboTitle.SelectionChangeCommitted
        sender.Tag = sender.SelectedIndex
    End Sub
 
    Private Sub cboTitle_TextChanged(sender As Object, e As EventArgs) Handles cboTitle.TextChanged
        If sender.Tag IsNot Nothing Then
            sender.Items(sender.Tag) = sender.Text
        End If
    End Sub
обращаю внимание на событие "SelectionChangeCommitted", оно выполняется после того, как значение было выбрано и выплывающий список закрылся
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
20.01.2016, 19:44  [ТС]
Всё работает. Спасибо.

Добавлено через 2 часа 36 минут
код срабатывает только если стиль Combobox = Simple.
а если стиль Combobox = DropDown не работает.

Извините ошибся. Поправлюсь.Код работает и там и там, только не на первом элементе списка

Добавлено через 7 минут
Ещё правка: sender.Tag = sender.SelectedIndex вставил в SelectedIndexChanged и всё заработало на всех элементах

Добавлено через 15 минут
Дело в том, что у меня два Combobox, каждому элементу первого соответствует свой элемент второго и наоборот.
Достигалось это так:

VB.NET
1
2
3
4
5
6
Private Sub cboTitle_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboTitle.SelectedIndexChanged
        'синхронизация выбранных пунктов между двумя combobox
        cboCommandLine.SelectedIndex = cboTitle.SelectedIndex
        idxCurItem = cboTitle.SelectedIndex    
        sender.Tag = sender.SelectedIndex   'это я добавил, иначе не редактируется первый элемент списка
End Sub
И теперь у меня получилась полная каша. Соответствия членов сбились.

Добавлено через 11 минут
неужели с задачей не справится без обращения к sender?
на VB-6 это было предельно просто
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
20.01.2016, 19:50
Sender - это имя контролам, кем вызывается данная процедура. Можете ее менять на имя другого контрола взависимости от вашей задачи
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
20.01.2016, 21:09  [ТС]
Нет ли в VB.net такой команды
добавить такой-то текст по такому-то индексу
VB.NET
1
cboTitle.AddItem cboTitle.Text, idxCurItem
Добавлено через 1 час 4 минуты
Задача решена. Но код довольно неуклюжий и объём его большой. К тому же пришлось вводить дополнительную переменную, чтобы отслеживать по какому из двух combobox мы кликаем и в зависимости от этого избегать обработки некоторых событий. На VB-6 код занимал 2 строчки в событии Change для каждого окна.
0
8 / 8 / 0
Регистрация: 07.06.2020
Сообщений: 90
29.12.2022, 02:39
Цитата Сообщение от Yury Komar Посмотреть сообщение
вот пример рабочий
VB.NET
1
2
3
4
5
6
7
8
9
Private Sub cboTitle_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboTitle.SelectionChangeCommitted
        sender.Tag = sender.SelectedIndex
End Sub
 
Private Sub cboTitle_TextChanged(sender As Object, e As EventArgs) Handles cboTitle.TextChanged
        If sender.Tag IsNot Nothing Then
            sender.Items(sender.Tag) = sender.Text
        End If
End Sub
обращаю внимание на событие "SelectionChangeCommitted", оно выполняется после того, как значение было выбрано и выплывающий список закрылся
Спасибо большое! То что я искал, но с одним моментом никак не разберусь...
Код корректно работает, если элемент выбран из списка и текст изменён после этого.
Для варианта, если я меняю текст без открытия списка добавил sender.Tag = sender.SelectedIndex ещё для события получения ComboBoxом фокуса (иначе некорректно работает):
VB.NET
1
2
3
Private Sub cboTitle_.GotFocus(sender As Object, e As EventArgs) Handles cboTitle.GotFocus
        sender.Tag = sender.SelectedIndex
End Sub
Но проблема в том, что если не раскрыть потом список и не выбрать компонент, индекс ComboBox почему-то сбрасывается на "элемент коллекции не выбран":
ComboBox.SelectedIndex = -1
До начала изменения текста, ComboBox.SelectedIndex = 0 (установлено програмно)
Кучу времени сижу, уже всё перепробовал... что-то простое должно быть, но упускаю...
0
8 / 8 / 0
Регистрация: 07.06.2020
Сообщений: 90
29.12.2022, 11:22
Если что, вариант сохранять индекс и потом его возвращать я пробовал:
Сохраняю при заполнении коллекции ComboBox выделенный по умолчанию индекс (в данном случае 0) в глобальную переменную ComboBox_Comp_Sel_Index.
После изменения текста в ComboBox без открытия списка и выбора из списка (текущий пункт) - SelectedIndex = -1
Индекс сменился, событие не сработало
VB.NET
1
2
3
4
5
6
7
Private Sub ComboBox_Component_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox_Component.SelectedIndexChanged
        If ComboBox_Component.SelectedIndex = -1 Then
            ComboBox_Component.SelectedIndex = ComboBox_Comp_Sel_Index
        Else
            ComboBox_Comp_Sel_Index = ComboBox_Component.SelectedIndex
        End If
End Sub
Я уже совсем озверел от этого... Никаких мыслей...
1
2283 / 1599 / 400
Регистрация: 26.06.2017
Сообщений: 4,739
Записей в блоге: 1
29.12.2022, 12:13
Alex2005-10, забейте Вы уже работать с элементами управления. Манипулируйте коллекциями, которые биндятся к элементам управления и всё получится.
0
8 / 8 / 0
Регистрация: 07.06.2020
Сообщений: 90
29.12.2022, 12:49
Uswer, что Вы имеете ввиду? Вроде и так создаётся коллекция, привязанная к ComboBox. И потом как же обратная связь?
0
2283 / 1599 / 400
Регистрация: 26.06.2017
Сообщений: 4,739
Записей в блоге: 1
29.12.2022, 13:45
Цитата Сообщение от Alex2005-10 Посмотреть сообщение
Вроде и так создаётся коллекция, привязанная к ComboBox.
Где? Об этом никто не упомянул. А если и так, то обращаться надо именно к этой коллекции через BindingContext.

Добавлено через 31 минуту
Alex2005-10, так то, как Вы хотите?
На форме должен быть ComboBox1.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Imports System.ComponentModel
 
Public Class Form1
 
  Private ItemList As New BindingList(Of String)
 
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    With ItemList
      .Add("1111")
      .Add("2222")
      .Add("3333")
    End With
    ComboBox1.DataSource = ItemList
  End Sub
 
  Private Sub ComboBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ComboBox1.Validating
    Dim contxt As BindingManagerBase = Me.BindingContext(ItemList)
    Dim index As Integer = contxt.Position 'можно было переменную не создавать, а на прямую использовать Position
    ItemList(index) = ComboBox1.Text
  End Sub
End Class
Обращаю внимание, что изменение производится в обработчике Validating, следовательно на форме должен быть любой другой элемент управления кроме ComboBox1, а само изменение произойдёт перед потерей фокуса.

Добавлено через 18 минут
В принципе можно вместо Validating использовать TextChanged.
1
8 / 8 / 0
Регистрация: 07.06.2020
Сообщений: 90
29.12.2022, 15:27
Интересный вариант! Спасибо! Возьму на вооружения, да и другим пригодится!
В свою очередь предложу ещё одно решение, всё-таки заставил работать код, как мне нужно :

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
    '-------------------------------------------------------------
    'Для ручного изменения имени пунктов ComboBox_Component (Text)
    '-------------------------------------------------------------
    'Глобальная переменная
    Dim ComboBox_Comp_Sel_Index As Integer              'Для индекса выбранного пункта в ComboBox
 
    'Происходит при изменении значения свойства Text.
    Private Sub ComboBox_Component_TextChanged(sender As Object, e As EventArgs) Handles ComboBox_Component.TextChanged
        If ComboBox_Component.Focused = True Then           'Если получен фокус ComboBox_Component (отсеивать изменения, происходящие не в ручную)
            If sender.Tag IsNot Nothing Then
                sender.Items(sender.Tag) = sender.Text
            End If
        End If
    End Sub
 
    'Событие "SelectionChangeCommitted" выполняется после того, как значение было выбрано из списка и список закрылся
    Private Sub ComboBox_Component_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox_Component.SelectionChangeCommitted
        sender.Tag = sender.SelectedIndex
        ComboBox_Comp_Sel_Index = ComboBox_Component.SelectedIndex  'Сохраняю SelectedIndex в глобальную переменную ComboBox_Comp_Sel_Index
        TabControl_Data.Focus()                                     'Снять выделение содержимого после выбора из списка (выделяю TabControl, где находится ComboBox)
    End Sub
 
    'Событие, если ComboBox получает фокус (изменение имени без раскрытия списка)
    Private Sub ComboBox_Component_GotFocus(sender As Object, e As EventArgs) Handles ComboBox_Component.GotFocus
        ComboBox_Comp_Sel_Index = ComboBox_Component.SelectedIndex  'Сохраняю SelectedIndex в глобальную переменную ComboBox_Comp_Sel_Index
        sender.Tag = sender.SelectedIndex
    End Sub
 
    'Событие, если ComboBox теряет фокус
    Private Sub ComboBox_Component_LostFocus(sender As Object, e As EventArgs) Handles ComboBox_Component.LostFocus
        ComboBox_Component.SelectedIndex = ComboBox_Comp_Sel_Index  'Сохраняю SelectedIndex в глобальную переменную ComboBox_Comp_Sel_Index
    End Sub
Очень хорошо, что на форуме сохранится история. Потом если у кого возникнет похожая проблема - несколько вариантов на выбор
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2022, 15:27
Помогаю со студенческими работами здесь

Combobox в окне с другим фоном. Как убрать белые углы combobox?
Основное окно имеет градиентную заливку фона. Также включены стили windows через манифест. #pragma...

Изменение шрифта в текстовом окне
Добрый день. Всю голову сломал не как не могу изменить шрифт в текстовом окне. Есть Главное окно программы, в нем создано дочернее...

В текстовом окне разрешение экрана не показывается
Привет форумчане! Сейчас осваиваю графику в Паскале. Вот программа: program GetMax; uses crt, graph; var gdriver,gmode :...

Содержимое второго ComboBox-а должно зависеть от выбранного элемента в первом ComboBox-е
Здраствуйте!У меня такая задачка. У меня есть 2 компонента CombBox. В первом я выбираю запись. А во втором записи дожны формироваться в...

Редактирование строки в текстовом файле
Здравствуйте. Есть текстовый файл, который формируется данными из textbox. Каким образом можно редактировать в нем уже имеющиеся...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru