Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Связь ComboBox'a c ListTextBox'oм Добавлено: 27.12.06 12:25  

Автор вопроса:  Maxxx | Web-сайт: polithelp.sibmediagroup.ru
Такая проблема:есть 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
Вот самый простой способ...
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 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-сайт: polithelp.sibmediagroup.ru
 Профиль | | #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
Плохо что в NET в комбо нет ItemData

Кто такое сказал? А для чего по твоему ValueMember?

Ответить

Номер ответа: 8
Автор ответа:
 avdey



ICQ: 219571279 

Вопросов: 34
Ответов: 486
 Профиль | | #8 Добавлено: 28.12.06 08:27
Ах вот теперь как это называется...

Ответить

Номер ответа: 9
Автор ответа:
 Maxxx



Вопросов: 7
Ответов: 23
 Web-сайт: polithelp.sibmediagroup.ru
 Профиль | | #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
        ;Dim P As System.Drawing.Point
        ;Dim sz As System.Drawing.Size
        ;Dim 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
        ;Dim 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
        ;Dim i As Short
        ;Dim 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
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...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам