• ベストアンサー

CLRフォームアプリケーションのlistboxについて。

CLRフォームアプリケーションでプログラムを作っているのですが、そこでlistboxについて質問です。 listboxの中で選択させたくない項目がある場合、選択させないということは可能なのでしょうか? できないとしたら、どういう方法を使うと良いかアドバイスお願いします。 下の画像のカテゴリーを選択したくない場合ということです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは。  どうやら、ウィンドウプロシージャをオーバーロードしても無理そうで、アイテム選択を拒絶する事は出来ず、受け入れるしか無い見たいです。  取りあえず、MouseDownとKeyDownで目当てのアイテムを選択しない様に阻止するしかないのではないでしょうか。  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.mousedown(VS.80).aspx  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.keydown(VS.80).aspx  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.indexfrompoint(VS.80).aspx  マウスだけではなく、キーボードも処理しなければならないので要注意です。  以下はtest2のアイテムを選択させないようにします。かなり厄介ですが、参考程度で。 private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { this->listBox1->Items->Add("test1"); this->listBox1->Items->Add("test2"); this->listBox1->Items->Add("test3"); //選択が変る前のインデックスをキープする為にTagメンバを利用する(普通のint型のメンバ変数でも構わない) this->listBox1->Tag = gcnew System::Int32(this->listBox1->SelectedIndex); } private: System::Void listBox1_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { System::Windows::Forms::ListBox^ listBox = static_cast<System::Windows::Forms::ListBox^>(sender); //アイテムが一つも無いので引き返す if(listBox->Items->Count <= 0) return; System::Int32% rTag = *static_cast<System::Int32^>(listBox->Tag); //↑キーが押された if(e->KeyValue == 38) rTag = System::Math::Max(--rTag, 0); //↓キーが押された if(e->KeyValue == 40) rTag = System::Math::Min(++rTag, listBox->Items->Count - 1); //アイテムの確認 System::Object^ item = listBox->Items[rTag]; //選択させたくないアイテムだった if(item == L"test2") { //リストボックスの選択位置を入れる rTag = listBox->SelectedIndex; //キー入力の拒絶してアイテム選択を阻止する e->Handled = true; } } private: System::Void listBox1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { System::Windows::Forms::ListBox^ listBox = static_cast<System::Windows::Forms::ListBox^>(sender); //マウスのクリックされた座標からアイテム位置を取る const System::Int32 index = listBox->IndexFromPoint(e->X, e->Y); //アイテムが無いので引き返す if(index == 0xffff) return; System::Int32% rTag = *static_cast<System::Int32^>(listBox->Tag); //アイテムの確認 System::Object^ item = listBox->Items[index]; //選択させたくないアイテムだった if(item == L"test2") { //以前の選択位置をセットしてアイテム選択を阻止する listBox->SelectedIndex = rTag; //引き返す return; } //以前の選択位置を更新 rTag = listBox->SelectedIndex; }

yozakura20
質問者

お礼

回答ありがとうございます。とても参考になりなんとか自力でできそうです。

関連するQ&A