C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: コンボボックス


(過去ログ 52 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■28783 / inTopicNo.1)  コンボボックス
  
□投稿者/ 外郎 (1回)-(2008/12/01(Mon) 02:30:32)

分類:[C#] 

@FolderBrowserDialogを開いて、任意のフォルダをユーザに選択させる。
A開いたフォルダのディレクトリをカレントディレクトリに登録。
BcomboBoxのItemsに、開いたフォルダの中から画像ファイルのファイル名だけを追加。
CcomboBoxに登録されている画像ファイル名を選択したら、
Dそのファイル名から絶対パスを取得して、pictureboxに選択した画像が表示される
というものを作りました。


しかし、1度任意のディレクトリからcomboBoxに画像を登録したあと、
先ほどとは別のディレクトリの画像を登録すると、
カレントディレクトリが、最初に登録した画像のディレクトリとは変わってしまうため、
表示させようとするとエラーになってしまいます。
これを解決するにはどのようにすればよいでしょうか?

分かりにくい日本語で申し訳ございませんが、
どなたかご教授お願いします。

引用返信 編集キー/
■28784 / inTopicNo.2)  Re[1]: コンボボックス
□投稿者/ aetos (19回)-(2008/12/01(Mon) 02:40:02)
No28783 (外郎 さん) に返信
> A開いたフォルダのディレクトリをカレントディレクトリに登録。
> BcomboBoxのItemsに、開いたフォルダの中から画像ファイルのファイル名だけを追加。

ここが NG。
ファイルアクセスはフルパスでやるのが基本。
DisplayMember と ValueMember を使い分けて、見た目にはファイル名だけ表示しつつ、裏ではフルパスを保持するようなことも可能ですので、探求してみてください。
引用返信 編集キー/
■28785 / inTopicNo.3)  Re[2]: コンボボックス
□投稿者/ 外郎 (3回)-(2008/12/01(Mon) 02:53:08)
aetos様、返信ありがとうございます。

私が、最初に投稿した方法も、
必死に探しまわってやっとできた方法でした。
どうか、
>>DisplayMember と ValueMember を使い分けて、見た目にはファイル名だけ表示しつつ、裏ではフルパスを保持するようなこと
の実装例を教えていただくわけにはいかないでしょうか?
お願いします。


引用返信 編集キー/
■28790 / inTopicNo.4)  Re[3]: コンボボックス
□投稿者/ やじゅ (814回)-(2008/12/01(Mon) 09:47:45)
やじゅ さんの Web サイト
No28785 (外郎 さん) に返信
> >>DisplayMember と ValueMember を使い分けて、見た目にはファイル名だけ表示しつつ、裏ではフルパスを保持するようなこと
> の実装例を教えていただくわけにはいかないでしょうか?
>

VB.NETではあるんですが、かつ内容もファイル名でもないんですが・・・、考え方で応用可能かと思います。

2列の値を持つコンボボックス[コード+値]
http://www.bnote.net/vb/2col_combobox.shtml
引用返信 編集キー/
■28795 / inTopicNo.5)  Re[1]: コンボボックス
□投稿者/ .SHO (254回)-(2008/12/01(Mon) 11:03:07)
No28783 (外郎 さん) に返信

> しかし、1度任意のディレクトリからcomboBoxに画像を登録したあと、
> 先ほどとは別のディレクトリの画像を登録すると、

この時に、前の登録を Clear() するのはダメですか?
ComboBoxがどんどん大きくなってしまいますし
複数フォルダの内容をファイル名だけで登録すると
同一ファイル名になる可能性があり、処理できなくなると思います。
引用返信 編集キー/
■28829 / inTopicNo.6)  Re[2]: コンボボックス
□投稿者/ 外郎 (4回)-(2008/12/01(Mon) 22:28:15)
やじゅさん

サンプル拝見させていただきましたが、
イマイチ理解できませんでした。
簡潔で構いませんので、使用例を示していただくわけにはいかないでしょうか?

.SHOさん
クリアーは、一定個数溜まった時点で随時行っていく予定ですので、
次のものを登録した時点で即削除というのは考えておりません。
引用返信 編集キー/
■28834 / inTopicNo.7)  Re[3]: コンボボックス
□投稿者/ 魔界の仮面弁士 (917回)-(2008/12/01(Mon) 23:21:34)
No28829 (外郎 さん) に返信
>>>> DisplayMember と ValueMember を使い分けて、見た目にはファイル名だけ表示しつつ、裏ではフルパスを保持
>>> の実装例を教えていただくわけにはいかないでしょうか?
>> 2列の値を持つコンボボックス[コード+値]
>> http://www.bnote.net/vb/2col_combobox.shtml
> イマイチ理解できませんでした。
> 簡潔で構いませんので、使用例を示していただくわけにはいかないでしょうか?


C# に書き換えてみました。これで分かりますか?

// -------------------------------------------

using FileItem = System.Collections.Generic.KeyValuePair<string, string>;

// -------------------------------------------
private void Form1_Load(object sender, EventArgs e)
{
 comboBox1.DisplayMember = "Value";
 comboBox1.ValueMember = "Key";

 // ここではサンプルなので、固定的なパスを書いていますが
 // 実際には、FolderBrowserDialog のディレクトリから
 // 列挙した画像のパスを入れる事になるでしょう。
 List<FileItem> list = new List<FileItem>();
 list.Add(new FileItem(@"C:\Windows\シャボン.bmp", "シャボン.bmp"));
 list.Add(new FileItem(@"C:\Windows\珈琲カップ.bmp", "珈琲カップ.bmp"));
 list.Add(new FileItem(@"C:\Windows\隅田川.bmp", "隅田川.bmp"));

 comboBox1.DataSource = list.ToArray();
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
 // 実際には、ここが PictureBox への画像処理になるはず。
 label1.Text = comboBox1.SelectedValue.ToString();
}
引用返信 編集キー/
■28836 / inTopicNo.8)  Re[4]: コンボボックス
□投稿者/ 外郎 (5回)-(2008/12/02(Tue) 00:19:51)
魔界の仮面弁士 さん、返信ありがとうございます。

画像読み込みの際、
img = new Bitmap(comboBox1.SelectedValue.ToString());
ではエラーが起きてしまうのですが、上記ではダメなのでしょうか??

また、usingに
FileItem = System.Collections.Generic.KeyValuePair<string, string>;
と書くのは煩わしいのですが、もう少し簡潔に書けないのでしょうか?

引用返信 編集キー/
■28839 / inTopicNo.9)  Re[5]: コンボボックス
□投稿者/ 魔界の仮面弁士 (918回)-(2008/12/02(Tue) 02:27:20)
2008/12/02(Tue) 02:34:17 編集(投稿者)

No28836 (外郎 さん) に返信
> img = new Bitmap(comboBox1.SelectedValue.ToString());
new Bitmap(string) のコンストラクタや Image.FromFile(string) メソッドは
ファイルをロックしてしまいますので、Image.FromStream(Stream) メソッドを
利用するようにしてみてください。

http://support.microsoft.com/kb/311754/


> ではエラーが起きてしまうのですが、上記ではダメなのでしょうか??
具体的には、どのようなエラーでしょうか?


> また、usingに
> FileItem = System.Collections.Generic.KeyValuePair<string, string>;
> と書くのは煩わしいのですが、もう少し簡潔に書けないのでしょうか?

using に別名を書くのが煩わしければ、記載せずとも構いません。その場合は、

List<FileItem> list = new List<FileItem>();
list.Add(new FileItem(@"C:\Windows\シャボン.bmp", "シャボン.bmp"));

の部分を

List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
list.Add(new KeyValuePair<string, string>(@"C:\Windows\シャボン.bmp", "シャボン.bmp"));

に変更してやるだけで OK です。
引用返信 編集キー/
■28840 / inTopicNo.10)  Re[6]: コンボボックス
□投稿者/ 外郎 (6回)-(2008/12/02(Tue) 02:49:22)
魔界の仮面弁士 さん

img = new Bitmap(comboBox1.SelectedValue.ToString());
のエラー文です。

NullReferenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
ドラブルシューティングのヒント:
オブジェクトインスタンス作成にはnewキーワードを使用します。
メソッドを呼び出す前に、オブジェクトがNullで良いかどうか確認してください。

Image.FromStream(Stream)を使えば良いとありますが、
どのように使えば良いのでしょうか?
引用返信 編集キー/
■28843 / inTopicNo.11)  Re[7]: コンボボックス
□投稿者/ まんごーぷりん (58回)-(2008/12/02(Tue) 06:59:17)
まんごーぷりん さんの Web サイト
No28840 (外郎 さん) に返信
> 魔界の仮面弁士 さん
>
> img = new Bitmap(comboBox1.SelectedValue.ToString());
> のエラー文です。

更に、以下のように分離できます。

string filename = comboBox1.SelectedValue.ToString(); // ファイル名の取り出し
img = new Bitmap(filename); // ビットマップイメージの取得

どちらで発生していますか?

引用返信 編集キー/
■28849 / inTopicNo.12)  Re[8]: コンボボックス
□投稿者/ 外郎 (7回)-(2008/12/02(Tue) 09:13:07)
No28843 (まんごーぷりん さん) に返信

教えて頂いたとおりにすると、
string filename = comboBox1.SelectedValue.ToString();
で同じエラーが発生します。

NullReferenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
ドラブルシューティングのヒント:
オブジェクトインスタンス作成にはnewキーワードを使用します。
メソッドを呼び出す前に、オブジェクトがNullで良いかどうか確認してください。
引用返信 編集キー/
■28850 / inTopicNo.13)  Re[9]: コンボボックス
□投稿者/ まんごーぷりん (59回)-(2008/12/02(Tue) 09:19:12)
まんごーぷりん さんの Web サイト
2008/12/02(Tue) 09:20:44 編集(投稿者)

No28849 (外郎 さん) に返信
> ■No28843 (まんごーぷりん さん) に返信
>
> 教えて頂いたとおりにすると、
> string filename = comboBox1.SelectedValue.ToString();
> で同じエラーが発生します。

ということは、comboBox1 か、SelectedValue が null(空っぽ)なので例外エラーが発生しているのですね。
comboBox1 は、フォームでベタっと貼り付けているので怪しいのは SelectedValue ではないかと思う訳です。

string filename = ((FileItem)(comboBox1.SelectedItem)).Key;

だとどーでしょー?
引用返信 編集キー/
■28866 / inTopicNo.14)  Re[7]: コンボボックス
□投稿者/ 魔界の仮面弁士 (919回)-(2008/12/02(Tue) 12:41:43)
2008/12/02(Tue) 13:12:33 編集(投稿者)

No28840 (外郎 さん) に返信
> NullReferenceExceptionはハンドルされませんでした。

そこまで分かれば、「どの操作に対してエラーが発生しているのか」を調べれば、対処法も見えてきます。
No28843 でまんごーぷりんさんが書かれているようにして、エラー箇所を特定しましょう。

> メソッドを呼び出す前に、オブジェクトがNullで良いかどうか確認してください。
このエラーメッセージのとおり、「null かどうか」のチェックを行ってください。

string path = comboBox1.SelectedValue as string;
if (!string.IsNullOrEmpty(path))
{
  label1.Text = path;
}
else
{
  label1.Text = "選択されていません";
}


No28850 (まんごーぷりん さん) に返信
> string filename = ((FileItem)(comboBox1.SelectedItem)).Key;
それだと、comboBox1.SelectedIndex = -1; な場合には、やはり NullReferenceException になるかと。


No28840 (外郎 さん) に返信
> Image.FromStream(Stream)を使えば良いとありますが、
> どのように使えば良いのでしょうか?
検索すれば幾つもの具体例が見つかるので、あえて書かなかったのですけれどね…。(^^;
(サンプルを複雑化すると読みにくくなるので)

エラー対処も含めた読み込み例:

//------------------------
Image newImage = null;
try
{
  // ファイルをロックさせないよう、Image.FromStream で読み込み
  using (FileStream stm = new FileStream(path, FileMode.Open))
  {
    newImage = Image.FromStream(stm);
    stm.Close();
  }
}
catch
{
  // 画像を読み込めなかった場合
  newImage = pictureBox1.ErrorImage;
  if (pictureBox1.ErrorImage != null)
  {
    newImage = (Image)pictureBox1.ErrorImage.Clone();
  }
}
finally
{
  // 表示させる画像の差し替え
  Image oldImage = pictureBox1.Image;
  pictureBox1.Image = newImage;
  if (oldImage != null)
  {
    oldImage.Dispose();
  }
}
引用返信 編集キー/
■28900 / inTopicNo.15)  Re[8]: コンボボックス
□投稿者/ まんごーぷりん (60回)-(2008/12/02(Tue) 15:41:04)
まんごーぷりん さんの Web サイト
No28866 (魔界の仮面弁士 さん) に返信

> ■No28850 (まんごーぷりん さん) に返信
>>string filename = ((FileItem)(comboBox1.SelectedItem)).Key;
> それだと、comboBox1.SelectedIndex = -1; な場合には、やはり NullReferenceException になるかと。

確かに、null チェックは必要なのですけれども、SelectedValue が常に null を返してしまっている可能性の方が高いように思えたのです。
いや、何故と聞かれると答えられないのですけれども。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -