tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル「*」 メタ文字について
記事No5531
投稿日: 2007/05/22(Tue) 01:39
投稿者area88
こんにちは、area88です。

「*」の使い方についてお聞きします。
「*」は、一般的にワイルドカードで使用します。
(例:*.DOCみたいに。)
ListBox1に、いかのコレクションが登録されているとします。
001 - 馬
001 - 白熊
001 - 犬
002 - 馬
002 - 猫
003 - かも鹿
など、番号と種類で構成されています。
ここで、001の項目を全て消去したいとする。
しかし、ListBox1.Items.Remove("001 - " + *)
という「*」の使い方ができません。
コンパイラーが、*を「式が必要です。」と言ってきます。
たぶん、掛け算の演算子と受け止めているのでしょうか、
ワイルドカードとして扱ってくれません。
何か、特別な記号でもつけるのでしょうか?
Stringを意味する、$をつけてもダメでした。
たとえば、VB*とすると、VB2005やVBAが当てはまります。
同じ要領で、001 - *で、001 - 馬 001 - 白熊 001 - 犬を当てはめ、
消去したいのですが、、。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: 「*」 メタ文字について
記事No5532
投稿日: 2007/05/22(Tue) 02:06
投稿者魔界の仮面弁士
> 「*」は、一般的にワイルドカードで使用します。
> (例:*.DOCみたいに。)
「*」をワイルドカードとして扱うには、『Like 演算子』を使います。これは、
 S = "001 - 馬"
 If S Like "001 - *" Then
  Label1.Text = "一致"
 Else
  Label1.Text = "不一致"
 End If
のようにして、True / False を返す式として使用されます。

また、Like 演算子以上に高機能な検索式として、
Regex クラスによる「正規表現」を用いる事もできます。


> しかし、ListBox1.Items.Remove("001 - " + *)
> という「*」の使い方ができません。
文法違反以前の問題として、そもそも Remove メソッドは、
ワイルドカードを受け付けるような構文を持ち合わせていません。
項目を一つ一つ列挙して、個別に消してください。

For index As Integer = ListBox1.Items.Count - 1 To 0 Step -1
    If ListBox1.Items(index).ToString() Like "001 - *" Then
        ListBox1.Items.RemoveAt(index)
    End If
Next

[ツリー表示へ]
タイトルRe^2: 「*」 メタ文字について
記事No5540
投稿日: 2007/05/22(Tue) 23:46
投稿者area88
こんにちは、area88です。

いつもいつも魔界の仮面弁士さん、ありがとうございます。

>文法違反以前の問題として、そもそも Remove メソッドは、
>ワイルドカードを受け付けるような構文を持ち合わせていません。

がーん!マジっすか、、、。(T_T)
制限というか、仕様というか、もっと勉強しないと。
上記の内容、ヘルプに記載あったかなぁ、、、。

Like 演算子、こりゃ、String専用ですか、、、。
もうちょっと、研究してみます。

[ツリー表示へ]
タイトルRe^3: 「*」 メタ文字について
記事No5547
投稿日: 2007/05/23(Wed) 18:27
投稿者魔界の仮面弁士
> 制限というか、仕様というか、もっと勉強しないと。
> 上記の内容、ヘルプに記載あったかなぁ、、、。

いや、それは逆ですよ。

* をワイルドカードとして使うという用途の方が、よほど特殊な話ですから、
ヘルプに「ワイルドカードが指定できます」と書かれていない限りは使えない、という事です。

それに、ワイルドカードとして使える文字が『*』であるとは限りません。

たとえば、Regex クラスで「0文字以上の任意の文字」を意味するのは『.*』ですし、
SQL Server の LIKE 演算子であれば『%』という文字になっています。

[ツリー表示へ]
タイトルRe^4: 「*」 メタ文字について
記事No5561
投稿日: 2007/05/25(Fri) 01:31
投稿者area88
こんにちは、area88です。

Give Up、、、。(T_T)

Dim X As Integer = e.RowIndex
Dim Y As Object = DataGridView3(2, X).Value
    For Each LB As Object In ListBox1.Items
        If Object.Equals(Y, LB) Then
           ListBox2.Items.Remove(DataGridView3(0, X).Value + " - " + Y)
           ListBox2.Items.Add(DataGridView3(0, X).Value + " - " + Y)
        End If
    Next

このようなコードを書いています。

ListBox1には、例として、「馬、牛、羊」が登録されています。

で、DataGridView3の行2のCellに、アイテムを入力すると(コンボボックスで選択できます。)
ListBox1に登録されているアイテムと一致すると、ListBox2に登録される仕組みです。

ここで、DataGridView3(0, X).Valueとは、000、001、、、という数列で、DataGridView3の行0に
すでに登録されています。(テキストから読み込んでいる。)

ListBox2に登録される形式は、000 - 馬、001 - 羊、、005 - 羊、、010 - 牛となっていきます。
もちろん、002 - 犬なら、ListBox1には登録されていないので、ListBox2には登録されません。

さて、ListBox2には、000や001には一つのアイテムしか登録したくありません。
すでに、000 - 馬がListBox2に登録されており、DataGridView3で、000を牛に変更した際、
ListBox2の000 - 馬を消去し、000 - 牛に登録しなおしたいのです。

このコードでは、000 - 馬が消えずに、000 - 牛が登録されていきます。そして次に変更した
アイテムもどんどん追加されていきます。(000アイテムが増えていく。)
000の後のアイテム(馬、牛、羊)は重複OKです。
000 - 馬、001 - 馬、002 - 馬でもOK。

そこで、000が一致したアイテムで、新規に登録したアイテムを残し(この場合は牛)、
古いアイテム(この場合は馬)を消去するため、Like演算子を使ったり、"000 - *"で
検索してみたり、Containsで一致を試みましたが、(これは完全一致ですね。)うまく
ListBox2で重複したとき、000アイテムが消えてくれません。
Replaceで、文字列の置換をやってみましたが、どーもイマイチで、、、。

何かいい方法、あるでしょうか?

[ツリー表示へ]
タイトルRe^5: 「*」 メタ文字について
記事No5568
投稿日: 2007/05/26(Sat) 01:10
投稿者area88
こんにちは、area88です。

解けたー!!!(^_^)v

  Dim X As Integer = e.RowIndex
  Dim Y As Object = DataGridView3(2, X).Value
    For Each LB As Object In ListBox1.Items

@ ListBox2.Items.Remove(DataGridView3(0, X).Value + " - " + LB)
        
    If Object.Equals(Y, LB) Then
           ListBox2.Items.Remove(DataGridView3(0, X).Value + " - " + Y)
           ListBox2.Items.Add(DataGridView3(0, X).Value + " - " + Y)
        End If
    Next

@のコードの挿入で、解決いたしました。
さらに、この位置でないとうまく動作しません。
(If Object.Equals(Y, LB) Thenコード以下では、まったく機能しませんでした。)
もともと、ListBox1のコレクションしか登録できないのだから、ListBox1のコレクションに
対応したアイテムを消すだけでよかったのですね。
まさに、Aha!体験だ〜!!!\(◎o◎)/!
たった1行のコードにたどり着くために、のべ12時間はかかったなぁ、、、。
けど、楽しいぜ!

[ツリー表示へ]