電子書籍の厳選無料作品が豊富!

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

「CLRフォームアプリケーションのlist」の質問画像

A 回答 (1件)

 こんにちは。


 どうやら、ウィンドウプロシージャをオーバーロードしても無理そうで、アイテム選択を拒絶する事は出来ず、受け入れるしか無い見たいです。
 取りあえず、MouseDownとKeyDownで目当てのアイテムを選択しない様に阻止するしかないのではないでしょうか。

 http://msdn.microsoft.com/ja-jp/library/system.w …
 http://msdn.microsoft.com/ja-jp/library/system.w …
 http://msdn.microsoft.com/ja-jp/library/system.w …

 マウスだけではなく、キーボードも処理しなければならないので要注意です。
 以下は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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/10 23:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!