Страница: 1 | 2 |
Вопрос: Связь ComboBox'a c ListTextBox'oм
Добавлено: 27.12.06 12:25
Автор вопроса: Maxxx | Web-сайт:
Такая проблема:есть combobox с именем, например, cmb1. И есть ListTetxBox с именем lst1. В Комбобокс можно добавлять новые элементы, удалять их, менять их имена и т.д. И нужно организовать связь комбобокс с литсбоксом. Т.е., а выбираю какой-нибудь элемент в cmb1 и и могу добавлять в lst1 элементы, которые будут связананы c cmb1. Например, я добавил в cmb1 элемент "Цвета", а в lst1 "Red", "Green". И т.д. Но если я начну удалять каке-нибудь элементы из cmb1, то как мне осуществить привязку нужного элемента cmb1 с нужными элементами lst1.
Ответы
Всего ответов: 25
Номер ответа: 1
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #1
Добавлено: 27.12.06 15:13
Вот самый простой способ...
With ComboBox1
.Items.Add("0"
.Items.Add("1"
.Items.Add("2"
.Items.Add("3"
.Items.Add("4"
End With
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Select Case ComboBox1.SelectedIndex
Case 0
With ListBox1
.Items.Clear()
.Items.Add("01"
.Items.Add("02"
.Items.Add("03"
End With
Case 1
With ListBox1
.Items.Clear()
.Items.Add("11"
.Items.Add("12"
.Items.Add("13"
End With
Case 2
With ListBox1
.Items.Clear()
.Items.Add("21"
.Items.Add("22"
.Items.Add("23"
End With
Case 3
With ListBox1
.Items.Clear()
.Items.Add("31"
.Items.Add("32"
.Items.Add("33"
End With
Case 4
With ListBox1
.Items.Clear()
.Items.Add("41"
.Items.Add("42"
.Items.Add("43"
End With
End Select
End Sub
Номер ответа: 2
Автор ответа:
Maxxx
Вопросов: 7
Ответов: 23
Web-сайт:
Профиль | | #2
Добавлено: 27.12.06 18:22
А если начать удалять элементы из комбо-бокса, то весь этот код перестает работать
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With ComboBox1
.Items.Add("0"
.Items.Add("1"
.Items.Add("2"
.Items.Add("3"
.Items.Add("4"
End With
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Select Case ComboBox1.SelectedIndex
Case 0
With ListBox1
.Items.Clear()
.Items.Add("01"
.Items.Add("02"
.Items.Add("03"
End With
Case 1
With ListBox1
.Items.Clear()
.Items.Add("11"
.Items.Add("12"
.Items.Add("13"
End With
Case 2
With ListBox1
.Items.Clear()
.Items.Add("21"
.Items.Add("22"
.Items.Add("23"
End With
Case 3
With ListBox1
.Items.Clear()
.Items.Add("31"
.Items.Add("32"
.Items.Add("33"
End With
Case 4
With ListBox1
.Items.Clear()
.Items.Add("41"
.Items.Add("42"
.Items.Add("43"
End With
End Select
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ComboBox1.SelectedIndex >= 0 Then 'проверка: выбран ли объект
Dim num_sel As Integer 'переменная для хранения номера выделенной переменной
num_sel = (ComboBox1.SelectedIndex) 'запись номера выделенной переменной
'вызов функции связи var с pok
ComboBox1.Items.RemoveAt(num_sel) 'удалем выбранную переменную
End If
End Sub
End Class
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 27.12.06 22:36
Как вариант.. можно в памяти создать DataTable, построить там обычное дерево и через DataSource привязать эту таблицу к твоим контролам.. Далее используя RowFilter в ListBox отображать подчиненные записи. Затем подписаться на событие RowDeleting и в нем удалять подчиненные записи .. Суть идеи заключается в том, что у обоих контролов общий источник данных в котором при помощи фильтра отображаешь те или иные записи..
Номер ответа: 4
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #4
Добавлено: 28.12.06 08:03
Мож мне прогу за тебя написать! Я тебе привел не готовый рабочий код, а пример!
Номер ответа: 5
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #5
Добавлено: 28.12.06 08:08
Плохо что в NET в комбо нет ItemData как в 6. Можно было бы туда заносить данные, а потом через Split вытаскивать в листбокс...
Номер ответа: 6
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #6
Добавлено: 28.12.06 08:12
О... мож создать lst As List и оттуда по ComboBox1.SelectedIndex вытаскивать через Split в листбокс? Удаление в этом случае не сложно реализовать.
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 28.12.06 08:18
Кто такое сказал? А для чего по твоему ValueMember?
Номер ответа: 8
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #8
Добавлено: 28.12.06 08:27
Ах вот теперь как это называется...
Номер ответа: 9
Автор ответа:
Maxxx
Вопросов: 7
Ответов: 23
Web-сайт:
Профиль | | #9
Добавлено: 28.12.06 08:36
Большое спасибо всем. Только у меня все-равно мозгов не хватает ваши ответы осознать Ладно, буду думать. А никто не видел, может где выложен похожий пример?
Номер ответа: 10
Автор ответа:
jeka
Вопросов: 1
Ответов: 5
Профиль | | #10
Добавлено: 28.12.06 15:18
А как Вам такой пример
Private Lst(99) As ListBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 im P As System.Drawing.Point
 im sz As System.Drawing.Size
 im i As Short
P.X = 10
P.Y = 100
sz.Height = 500
sz.Width = 500
For i = 0 To 99
Lst(i) = New ListBox
Me.Controls.Add(Lst(i))
Lst(i).Visible = True
Lst(i).Location = P
Lst(i).Size = sz
Next i
End Sub
Private Sub CMb_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CMb.SelectedIndexChanged
 im i As Short
For i = 0 To 99
If i <> CMb.SelectedIndex Then
Lst(i).SendToBack()
End If
Next
End Sub
Private Sub CmdAddList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAddList.Click
CMb.Items.Add(CMb.Items.Count + 1)
CMb.SelectedIndex = CMb.Items.Count - 1
End Sub
Private Sub CmdAddRecordToList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAddRecordToList.Click
Lst(CMb.SelectedIndex).Items.Add(Lst(CMb.SelectedIndex).Items.Count + 1)
End Sub
Private Sub CmdDelList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdDelList.Click
 im i As Short
 im Itm As Object
Lst(CMb.SelectedIndex).Items.Clear()
For i = CMb.SelectedIndex To 98
Lst(i).Items.Clear()
For Each Itm In Lst(i + 1).Items
Lst(i).Items.Add(Itm)
Next
Next
Lst(99).Items.Clear()
CMb.Items.Remove(CMb.SelectedItem)
CMb.SelectedIndex = CMb.Items.Count - 1
End Sub
Private Sub CmdDelRecordFromList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdDelRecordFromList.Click
Lst(CMb.SelectedIndex).Items.Remove(Lst(CMb.SelectedIndex).Items.Count)
End Sub
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 28.12.06 18:12
jeka,
фига ссе... мне показалось или ты на самом деле думаешь, что добавлять в run-time на форму 100 ListBox' ов - это правильно???
А ф-я SelectedIndexChanged вообще привела к состоянию близкому к нервному срыву и стрессу...
Грустно становится... грустно и страшно...
Сынок.. я тебя очень прошу.. брось ты это занятие.. программирование.. это не твое... ((
Послушайся дедушку EROS'a ..
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 28.12.06 20:03
Maxxx
Я преднамеренно не стал делать добавление и удаление, это тебе домашнее задание Разберись как работает код.. а дальше сам догадаешься..
Imports System.Drawing
''' <summary>
''' VS 2005
''' </summary>
''' <remarks>
''' ADD TO FORM
''' - ComboBox
''' - ListBox
''' </remarks>
Public Class Form1
Dim MyCollection As New MyItemCollection
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
With MyCollection
.Add(New MyItem(GetType(ConsoleKey)))
.Add(New MyItem(GetType(DayOfWeek)))
.Add(New MyItem(GetType(TypeCode)))
.Add(New MyItem(GetType(KnownColor)))
.Add(New MyItem(GetType(ContentAlignment)))
.Add(New MyItem(GetType(FontStyle)))
.Add(New MyItem(GetType(RotateFlipType)))
.Add(New MyItem(GetType(Drawing.Text.TextRenderingHint)))
End With
With ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
.Cursor = Cursors.Hand
.DisplayMember = "Name"
.ValueMember = "Items"
.DataSource = MyCollection
End With
End Sub
Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
ListBox1.Items.Clear()
If ComboBox1.SelectedValue Is Nothing Then Return
ListBox1.Items.AddRange(ComboBox1.SelectedValue)
End Sub
End Class
Public Class MyItem
Public Sub New(ByVal value As System.Type)
If value Is Nothing Then _
Throw New NullReferenceException
Dim names As Array = value.ToString.Split("."
_name = names(names.Length - 1)
_items = System.Enum.GetNames(value)
End Sub
#Region " Public Property's "
Private _name As String
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
Private _items As Array
Public ReadOnly Property Items() As Array
Get
Return _items
End Get
End Property
#End Region
End Class
Public Class MyItemCollection
Inherits List(Of MyItem)
End Class
Номер ответа: 13
Автор ответа:
jeka
Вопросов: 1
Ответов: 5
Профиль | | #13
Добавлено: 29.12.06 11:07
2Eros, слушай, если ты такой нервный мож тебе лечится. Выпей валерьяночки... )).
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 29.12.06 11:52
Да я не нервный, и пью уже давно не валерьянку .. Просто обидно, что из-за таких как ты и подобных тебе "программистов", NET-чиков за людей не считают..
Номер ответа: 15
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #15
Добавлено: 29.12.06 14:16
2EROS
ЗАЧОТ!!!
2jeka
Мда... держать на форме 100 листбоксов и менять ZOrder...