tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルListBoxの高度な使い方
記事No3682
投稿日: 2006/05/15(Mon) 12:27
投稿者ハイタワー
[OSのVer]:WindowsXp    [VBのVer]:VB.NET2003 
2つのリストボックスを使って一つのリストボックス(ListBox1)に並んでいるリストからselectするともうひとつのリストボッ
クス(ListBox2)に順次並ぶようなコードを作りたいのですが、その場合、同じ項目を選んでももうひとつのリスト
ボックス(ListBox2)に並ばないようにしたいんですが、その場合、Select文で作成したいのですが。
ListBox1.SelectedItemsを使って作りたいです。メソッドとしてとりあえず、For文でListBox1のすべてのリスト
を順次確認してSelectedItemsで
SelectedしたものがListBox1にあれば、Select Case でTrueにしてそれから、もうひとつのListBox2に。
同じ項目があればIf文で抜けるような動作のプログラムが組めません。何か良い方法ないでしょうか?
動作としては選らんだものが順次ListBox2に並び、同じ物が選ばれないようにしたいだけなんですが。
但し、選んだ順番は変わらないとして。高度な使い方と記載してますが難しいのかどうかもわかりません。

[ツリー表示へ]
タイトルRe: ListBoxの高度な使い方
記事No3685
投稿日: 2006/05/15(Mon) 15:53
投稿者ハイタワー
[OSのVer]:Windows    [VBのVer]:VB.NET
とりあえず、私のコード途中なんですが
下記のような感じで作成しています。*印は不明確な部分で、わかりません。
流れは下記の感じなんですが。コードを記載しても動作できないのでどうんあn
感じになるかわかりません。SelectedIndexChangedでいいのかどうかも
 
Private Sub ListBox1_SelectedIndexChanged(*****************
Dim o,o2,i As Integer 
For o=0 To ListBox1.Items.Count -1
   Select Case ListBox1.SelectItems(i)
      Case Is = ListBox1.Items(o)

        If ListBox2.Items.Count > 0 Then
           For o2 = 0 To ListBox2.Items.Count -1
              If ListBox1.Items(o) = ListBox2.Items(o2) Then
                 '同じ
                 Exit For
        End If
           Next o2
           If o2 < 0 Or ListBox2.Items.Count -1 < o2 Then
                 ListBox2.Items.Add(ListBox1.Items(o))
           Else
           End If
        Else
                 ListBox2.Items.Add(ListBox1.Items(o))
        End If
     Case *********  'このあたりがわからない
        If ListBox2.Items.Count > 0 Then
           For o2 = 0 To ListBox2.Items.Count -1
               If ListBox1.Items(o) = ListBox2.Items(o2) Then
                 '同じ
                 Exit For
         End If
           Next o2
           If o2 >= 0 And o2 <= ListBox2.Items.Count -1 Then
               ListBox2.Items.Remove(o2)
           End If
        Else
        End If
     Case Else
  End Select
Next o
End Sub

[ツリー表示へ]
タイトルRe: ListBoxの高度な使い方
記事No3689
投稿日: 2006/05/15(Mon) 22:49
投稿者なおこ(・∀・)
参照先http://naoko.wankuma.com/
お世話になります。

> 2つのリストボックスを使って一つのリストボックス(ListBox1)に並んでいるリストからselect
する
ともうひとつのリストボッ
> クス(ListBox2)に順次並ぶようなコードを作りたいのですが、その場合、同じ項目を選んでもも

ひとつのリスト
> ボックス(ListBox2)に並ばないようにしたいんですが

本当にやりたい事が、よく解っていませんが、こういう事でしょうか。
Private m_ht As Hashtable
Private m_currentKey As String = String.Empty

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles
MyBase.Load
  Me.m_ht = New Hashtable
  Me.m_ht.Add("a", New String() {"あああ1", "いいい1", "
ううう1"})
  Me.m_ht.Add("b", New String() {"あああ2", "いいい2", "
ううう2"})
  Me.m_ht.Add("c", New String() {"あああ3", "いいい3", "
ううう3"})
  Me.m_ht.Add("d", New String() {"あああ4", "いいい4", "
ううう4"})
  Me.m_ht.Add("e", New String() {"あああ5", "いいい5", "
ううう5"})
  Me.m_ht.Add("f", New String() {"あああ6", "いいい6", "
ううう6"})

  Me.ListBox1.Items.Clear()
  For Each key As String In Me.m_ht.Keys
    Me.ListBox1.Items.Add(key)
  Next
End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) _
                      Handles ListBox1.SelectedIndexChanged
  If Me.ListBox1.SelectedIndex < 0 Then Return
  Dim selectedKey As String = DirectCast(Me.ListBox1.Items(Me.ListBox1.SelectedIndex),
String)
  If Me.m_currentKey = selectedKey Then Return
  Me.m_currentKey = selectedKey

  Dim values() As String = DirectCast(Me.m_ht(selectedKey), String())
  Me.ListBox2.Items.Clear()
  For Each value As String In values
    Me.ListBox2.Items.Add(value)
  Next
End Sub

[ツリー表示へ]
タイトルRe^2: ListBoxの高度な使い方
記事No3692
投稿日: 2006/05/16(Tue) 10:52
投稿者ハイタワー
[OSのVer]:WindowsXp    [VBのVer]:VB.NET2005  
なおこさん、ありがとうございます。返答遅くなりました。
わからないコードがたくさんありましたので
例をもとに、なおこさんのコードで動作してみたのですが、イメージが違っておりました。
ListBox1にAddされているストリングを選択すれば、そのままListBox2にaddされるのですが、さらに
ListBox1のあるのもを選ぶとListBox2にAddされていきます。ただそのときにすでにListBox2にならんで
いるものが重複しないようにしたいのと、再度、ListBox1で選択するとListBox2から消える感じのイメ
ージです。ListBox1の項目は消えたりはしません。保持されたままなんですが。
この掲示板でイメージ図が貼れればいいんですが。

[ツリー表示へ]
タイトルRe^3: ListBoxの高度な使い方
記事No3696
投稿日: 2006/05/17(Wed) 10:18
投稿者なおこ(・∀・)
参照先http://naoko.wankuma.com/
お世話になります。

> ListBox1にAddされているストリングを選択すれば、そのままListBox2にaddされるのですが、さら

> ListBox1のあるのもを選ぶとListBox2にAddされていきます。ただそのときにすでにListBox2にな
らん

> いるものが重複しないようにしたいのと、再度、ListBox1で選択するとListBox2から消える感じの


> ージです。ListBox1の項目は消えたりはしません。保持されたままなんですが。

そうですか。
じゃ、こんな感じかな?(前のレスも今回もレスも別段高度な事は何もやっていませんが)
Public Class Form2
  Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
#End Region

  Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles
MyBase.Load
    Me.ListBox1.Items.Clear()
    Me.ListBox1.Items.Add("aaa")
    Me.ListBox1.Items.Add("bbb")
    Me.ListBox1.Items.Add("ccc")
    Me.ListBox1.Items.Add("ddd")
  End Sub

  Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ListBox1.SelectedIndexChanged
    If Me.ListBox1.SelectedIndex < 0 Then Return
    Dim selectedKey As String = DirectCast(Me.ListBox1.Items(Me.ListBox1.SelectedIndex),
String)

    Dim isContains As Boolean = Me.ListBox2.Items.Contains(selectedKey)

    If isContains Then
      'ListBox2 に既に含まれている時
      Me.ListBox2.Items.Remove(selectedKey)
    Else
      'ListBox2 に含まれていない時
      Me.ListBox2.Items.Add(selectedKey)
    End If
  End Sub
End Class

[ツリー表示へ]
タイトルRe^4: ListBoxの高度な使い方
記事No3697
投稿日: 2006/05/17(Wed) 17:35
投稿者ハイタワー
[OSのVer]:WindowsXp    [VBのVer]:VB.NET2005
なおこさん、ご返答ありがとうございます。  
なおこさん、すばらしいです。ListBox動作は私のやりたいことができています。

わたしはSelect Case後のオブジェクトとして 何がいいのかがわからなくて。
たいへん参考になりました。isContainsとかItems.Containsはしらなかったので。
VBの前のバージョンではUPDOWNボタンがあってListBox2に移動させたあと
ソートするつもりでいました。
私のコードでSelect文を使用していますが、基本的にはつらいコードですよね?

[ツリー表示へ]
タイトルRe^5: ListBoxの高度な使い方
記事No3703
投稿日: 2006/05/18(Thu) 11:42
投稿者ハイタワー
[OSのVer]:WindowsXp    [VBのVer]:VB.NET2005  
なおこさん、どうもです。SelectionModeが違っていました。oneだとなおこさんのがいいのですが。
ListBox1の選択履歴を残す意味でこれがSelectionModeがMultiSimpleだと動作が違ってきます。
ListBox1のSelectionModeがoneの場合と同じ動作をさせたいのですが、そういう場合はやはり
違ってきますか?

[ツリー表示へ]
タイトルRe^6: ListBoxの高度な使い方
記事No3710
投稿日: 2006/05/19(Fri) 09:29
投稿者なおこ(・∀・)
参照先http://naoko.wankuma.com/
お世話になります。

> なおこさん、どうもです。SelectionModeが違っていました。oneだとなおこさんのがいいのですが

> ListBox1の選択履歴を残す意味でこれがSelectionModeがMultiSimpleだと動作が違ってきます。
> ListBox1のSelectionModeがoneの場合と同じ動作をさせたいのですが、そういう場合はやはり
> 違ってきますか?

以下のような感じになりますけども。
あとはご自身で考えてみてください。

Private Sub Form2_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
  Me.ListBox1.Items.Clear()
  Me.ListBox1.Items.Add("aaa")
  Me.ListBox1.Items.Add("bbb")
  Me.ListBox1.Items.Add("ccc")
  Me.ListBox1.Items.Add("ddd")

  Me.ListBox1.SelectionMode = SelectionMode.MultiSimple
End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles ListBox1.SelectedIndexChanged
  Me.ListBox2.Items.Clear()
  If Me.ListBox1.SelectedIndex < 0 Then Return
  If Me.ListBox1.SelectedItems.Count < 1 Then Return

  For Each selectedKey As String In Me.ListBox1.SelectedItems
    Me.ListBox2.Items.Add(selectedKey)
  Next
End Sub

[ツリー表示へ]
タイトルRe^7: ListBoxの高度な使い方
記事No3715
投稿日: 2006/05/19(Fri) 18:26
投稿者ハイタワー
[OSのVer]:Windows    [VBのVer]:VB.NET  
なおこさん、ありがとうございます。
がんばってみます。またできあがったときはアップします。

[ツリー表示へ]