- PR -

[C#] listboxの項目から特定の文字列を抜き出す方法

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-08 23:22
引用:

Syouさんの書き込み (2006-02-08 22:59) より:

それを足して全て表示させるというやり方を イベントのtextBox1_Enter、textBox1_Leave、textBox1_TextChangedとboolで分けることによって実装できました。


最後に決まるものは最後に決めていいんじゃないでしょうか?
少なくとも、TextChanged イベントでの実装は不要な気がしますが...

ブール値を使っている理由も思い浮かびません。
ハンドラがどの TextBox も一緒ということでしょうか?
だとしたら sender で判断すべきですから、違うかな?

引用:

あと、もう1つなのですが、テキストをリストボックスに読み込ませる場合、StreamReaderで
listBox1.Items.Add(reader.ReadLine()); という風にすれば出来るのですが、


null が入らない保証がないですね、このコード。
StreamReader.ReadLine メソッドの結果は変数に一度取り検証した方が良いでしょう。

引用:

int line_check = listBox1.Items.Count;
for (int write = 0; write != line_check; write++)


何か怖いですね。

コード:

    for (int i = 0; i <= this.listBox1.Items.Count - 1; i++)


でしょう。

引用:

listBox1.SelectedIndex = write;
writer.WriteLine(listBox1.SelectedItem.ToString()); //不明!


ListBox.Items コレクションから順次取得すべきでは?
SelectedItem だとアイテムが文字列である保証もないですし。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Syou
会議室デビュー日: 2006/02/03
投稿数: 13
投稿日時: 2006-02-09 19:14
引用:

じゃんぬねっとさんの書き込み (2006-02-08 23:22) より:

最後に決まるものは最後に決めていいんじゃないでしょうか?
少なくとも、TextChanged イベントでの実装は不要な気がしますが...

ブール値を使っている理由も思い浮かびません。
ハンドラがどの TextBox も一緒ということでしょうか?
だとしたら sender で判断すべきですから、違うかな?



変な考え方かもしれませんが以下のようにしました。
listBox1_SelectedIndexChanged で、splitを用いて分けたものをそれぞれのtextboxにすべて代入し終えたら、boolでtrueに設定(あらかじめfalseに設定)
(代入途中でtextBox1_TextChangedが働いてしまうため)
textBox1_Enter で、ひとまずそれぞれのテキストに入っている値をstringを用いて取得し、1つにまとめる
textBox1_TextChangedで、bolがtrueならテキストが変更されたらそれぞれのテキストに入っている値をstringを用いて取得し、1つにまとめる作業を許可する
最後にtextBox1_Leaveでboolをfalseに設定する

という感じでひとまず動作はしました。

引用:

あと、もう1つなのですが、テキストをリストボックスに読み込ませる場合、StreamReaderで
listBox1.Items.Add(reader.ReadLine()); という風にすれば出来るのですが、

null が入らない保証がないですね、このコード。
StreamReader.ReadLine メソッドの結果は変数に一度取り検証した方が良いでしょう。



以下のように対処しています。
string A;
while ((A = reader.ReadLine()) != null)
  {
    listBox1.Items.Add(reader.ReadLine());
  }



コード:

    for (int i = 0; i <= this.listBox1.Items.Count - 1; i++)




引用:

listBox1.SelectedIndex = write;
writer.WriteLine(listBox1.SelectedItem.ToString()); //不明!

ListBox.Items コレクションから順次取得すべきでは?
SelectedItem だとアイテムが文字列である保証もないですし。


for (int i = 0; i <= this.listBox1.Items.Count - 1; i++)
   {
     //listBox1.SelectedIndex = write;
     writer.WriteLine(listBox1.Items[i].ToString());

   }
listBox1.SelectedIndex = -1;
writer.Close();
stm.Close();

にすることでできました。ありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-09 19:46
引用:

Syouさんの書き込み (2006-02-09 19:14) より:

変な考え方かもしれませんが以下のようにしました。


よくわかりませんでしたが、SelectedIndexChanged のタイミングの都合上、
少し泥臭い実装になってしまったってことですね。

引用:

以下のように対処しています。

string A;
while ((A = reader.ReadLine()) != null)
{
  listBox1.Items.Add(reader.ReadLine());
}


これ、シーク位置が先に進んじゃいません? (1 行飛んじゃう)
こういう実装をしたいのであれば、Peek メソッドを使います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Syou
会議室デビュー日: 2006/02/03
投稿数: 13
投稿日時: 2006-02-10 21:09
引用:

よくわかりませんでしたが、SelectedIndexChanged のタイミングの都合上、
少し泥臭い実装になってしまったってことですね。



Textに代入する際、TextChangedが適用されているため、boolでTextに代入させたあとTextChangedが適用されるようになっています。

引用:

これ、シーク位置が先に進んじゃいません? (1 行飛んじゃう)
こういう実装をしたいのであれば、Peek メソッドを使います。



なるほど・・・確かに確認したところwhileだと1行飛ばしてしまいますね・・
Peekを以下のように適用したところ、できました。ありがとうございます。

while (reader.Peek() > -1)
  {
    listBox1.Items.Add(reader.ReadLine());
  }

すいません、さらにもうあと1つ質問なのですがじゃんぬさんのサイトでSubStringを参考にして

// 必要な変数を宣言する
string stTarget = listBox1.SelectedItem.ToString();

// 先頭から '{' を検索し、見つかった位置を取得する
int iFind1 = stTarget.IndexOf('{');

// {(iFind1) 文字目の後から '}' を検索し、見つかった位置を取得する
int iFind2 = stTarget.IndexOf('}', iFind1);

// }(iFind2) 文字目の後から '{' を検索し、見つかった位置を取得する
int iFind3 = stTarget.IndexOf('{', iFind2);

// {(iFind3) 文字目の後から '}' を検索し、見つかった位置を取得する
int iFind4 = stTarget.IndexOf('}', iFind3);

/// <SubStringを用いて iFind1からiFind2の文章を取得>
stTarget = stTarget.Substring(iFind1, iFind2);

/// <SubStringを用いて iFind3からiFind4の文章を取得>
string equipscript_bunsyou = stTarget.Substring(iFind3, iFind4);

としました。コンパイルはできましたが読み込み時SubStringで例外エラーArgumentOutOfRangeExceptionがハンドルされないというのがでます。
iFind1,iFind2,iFind3,iFind4の数値代入はデバッグで見たところ出来ています。
どこがおかしいのかヒントだけでもいいのでよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-11 00:51
引用:

Syouさんの書き込み (2006-02-10 21:09) より:

コンパイルはできましたが読み込み時SubStringで例外エラーArgumentOutOfRangeExceptionがハンドルされないというのがでます。
iFind1,iFind2,iFind3,iFind4の数値代入はデバッグで見たところ出来ています。
どこがおかしいのかヒントだけでもいいのでよろしくお願いします。


まず、ArgumentOutOfRangeException をリファレンスで見てください。
何かが範囲外であることが原因だとわかります。

たとえば、文字数が 5 なのに 6 文字目を取得しようとしている、
つまり範囲外の値を取り出そうとしていることが考えられると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Syou
会議室デビュー日: 2006/02/03
投稿数: 13
投稿日時: 2006-02-12 23:17
引用:

まず、ArgumentOutOfRangeException をリファレンスで見てください。
何かが範囲外であることが原因だとわかります。

たとえば、文字数が 5 なのに 6 文字目を取得しようとしている、
つまり範囲外の値を取り出そうとしていることが考えられると思います。


2日ほどあいてしまいましたが・・
よく調べたらそうでした・・あまり調べもせず質問してしまってすいません。

調べて、修正したら{}内の範囲を取得することが出来ました。
ありがとうございます!

スキルアップ/キャリアアップ(JOB@IT)