- - PR -
[C#] listboxの項目から特定の文字列を抜き出す方法
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-08 23:22
最後に決まるものは最後に決めていいんじゃないでしょうか? 少なくとも、TextChanged イベントでの実装は不要な気がしますが... ブール値を使っている理由も思い浮かびません。 ハンドラがどの TextBox も一緒ということでしょうか? だとしたら sender で判断すべきですから、違うかな?
null が入らない保証がないですね、このコード。 StreamReader.ReadLine メソッドの結果は変数に一度取り検証した方が良いでしょう。
何か怖いですね。
でしょう。
ListBox.Items コレクションから順次取得すべきでは? SelectedItem だとアイテムが文字列である保証もないですし。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-09 19:14
変な考え方かもしれませんが以下のようにしました。 listBox1_SelectedIndexChanged で、splitを用いて分けたものをそれぞれのtextboxにすべて代入し終えたら、boolでtrueに設定(あらかじめfalseに設定) (代入途中でtextBox1_TextChangedが働いてしまうため) textBox1_Enter で、ひとまずそれぞれのテキストに入っている値をstringを用いて取得し、1つにまとめる textBox1_TextChangedで、bolがtrueならテキストが変更されたらそれぞれのテキストに入っている値をstringを用いて取得し、1つにまとめる作業を許可する 最後にtextBox1_Leaveでboolをfalseに設定する という感じでひとまず動作はしました。
以下のように対処しています。 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.Items[i].ToString()); } listBox1.SelectedIndex = -1; writer.Close(); stm.Close(); にすることでできました。ありがとうございます。 | ||||||||||||||||||||
|
投稿日時: 2006-02-09 19:46
よくわかりませんでしたが、SelectedIndexChanged のタイミングの都合上、 少し泥臭い実装になってしまったってことですね。
これ、シーク位置が先に進んじゃいません? (1 行飛んじゃう) こういう実装をしたいのであれば、Peek メソッドを使います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-10 21:09
Textに代入する際、TextChangedが適用されているため、boolでTextに代入させたあとTextChangedが適用されるようになっています。
なるほど・・・確かに確認したところ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の数値代入はデバッグで見たところ出来ています。 どこがおかしいのかヒントだけでもいいのでよろしくお願いします。 | ||||||||||||||||||||
|
投稿日時: 2006-02-11 00:51
まず、ArgumentOutOfRangeException をリファレンスで見てください。 何かが範囲外であることが原因だとわかります。 たとえば、文字数が 5 なのに 6 文字目を取得しようとしている、 つまり範囲外の値を取り出そうとしていることが考えられると思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-02-12 23:17
2日ほどあいてしまいましたが・・ よく調べたらそうでした・・あまり調べもせず質問してしまってすいません。 調べて、修正したら{}内の範囲を取得することが出来ました。 ありがとうございます! |