• ベストアンサー

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

  • CLRでのListBoxのオーナードローのやり方。

    Visual C++のCLRでフォームアプリケーションを作っていて、ListBoxのオーナードローの方法がわからないので質問させてもらいました。 CLRでプログラミングしたことが無く書籍などを読んだこともなく見よう見まねで作っています。 やりたいことはとりあえず http://dobon.net/vb/dotnet/control/lbownerdraw.html にあることです。 サンプルプログラムはVBとC#でC++がありません。 MSDN(http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.drawitem.aspx)も同様でVBとC#のサンプルプログラムでC++がありませんでした。 とりあえず。 C#のサンプル----------------------------------------------- //DrawItemイベントハンドラ //項目を描画する private void ListBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { //背景を描画する //項目が選択されている時は強調表示される e.DrawBackground(); //文字を描画する色の選択 Brush b = null; if ((e.State & DrawItemState.Selected) != DrawItemState.Selected) { //選択されていない時 switch (e.Index % 3) { case 0: b = new SolidBrush(Color.Red); break; case 1: b = new SolidBrush(Color.Blue); break; case 2: b = new SolidBrush(Color.Green); break; } } else { //選択されている時はそのままの前景色を使う b = new SolidBrush(e.ForeColor); } //描画する文字列の取得 string txt = ((ListBox) sender).Items[e.Index].ToString(); //文字列の描画 e.Graphics.DrawString(txt, e.Font, b, e.Bounds); //後始末 b.Dispose(); //フォーカスを示す四角形を描画 e.DrawFocusRectangle(); } ----------------------------------------------- を参考にしてForm1に private: System::Void ListBox1_DrawItem(System::Object^ sender, System::Windows::Forms::DrawItemEventArgs^ e) { //背景を描画する //項目が選択されている時は強調表示される e->DrawBackground(); //文字を描画する色の選択 } と書いてみたのですが、そのあとどうすればよいかわかりません。 わかる方、回答お願いします。

  • [CLR][C++]HTTPPOSTについて

    C++のCLRフォームアプリケーションで開発しています。 プログラムの中で、mixiなどのログインフォームにデータを POSTし、ログインする仕組みが必要になりました。 しかし、検索しても 「MFC」 の文献しか出てこず、 フォームアプリケーションの資源が使えなくて困っています。 このような仕組みをC++CLRフォームアプリケーションで作成することは 出来るのでしょうか。またその方法を教えていただけるとありがたいです。 使用ソフト:VisualStudio2005Academic

  • CLRのメッセージの送信について。

    WIN32APIを使って今までプログラムを作っていましたが、CLRを使ってプログラミングをしようと思い始めたのですが要領がつかめません。 やりたいことは他のアプリケーションにメッセージを送信することです。APIのPostMessage(HWND_BROADCAST, Message, 1, 0); のような感じでForm1の設定の内容を送りたいのですがどうすればそのようなことができるのでしょうか? Visual C++ で新しいプロジェクトCLR Windows フォームアプリケーション を選択してプロジェクトを作りました。 そのあとどうすればよいか教えてください。 そもそもForm1のウィンドウプロシージャはどうなってるのかすらわかりません。仕組みがちんぷんかんぷんでした。

  • C#Windowsフォームアプリケーションについて

    C#Windowsフォームアプリケーションについての質問です。 どういうプログラムを組めばいいのかわかりません。おしえていただきたいです 詳細は画像を張りました。 よろしくお願いします 。

  • 【WPF】【C#】【XAML】LISTBOX

    WPFのListBoxについて1から勉強をしているものです。 ・項目 削除(CheckBox),ID(TextBlock),カテゴリ(TextBlock),画像(BitmapImage)を一行とするリストを追加、編集、削除できる。 ・ID、カテゴリにそれぞれボタン機能を有し、押下することにより各項目に対してソート(昇順⇔降順)できる。 ・追加ボタン⇒追加画面を起動し各項目を入力しリストに行を追加する。 ・編集ボタン⇒選択中のリストに対して別で編集画面を表示させ選択中のリストの編集を行える。 ・削除のチェックがついている行を全て削除する。 このような仕様の画面を作っています。 現在、追加画面からの行の追加はできるようになりました。 しかし残り仕様を満たす解決策が分からず ネットで調べたところ単一項目のケースでの編集、削除、ソートはよく見かけるのですが。 今回の様にリストに複数項目がある状態からの編集、削除、ソートの事例が見つからず困っています。 ListBoxでやる必要ないのでは?と思われる方もいらっしゃると思いますが。 お聞きしたいことというのは、 ListBoxで選択行のテキストブロックの情報を取れるのかどうか。 ListBoxで削除(CheckBox)がついている行を特定できるのかどうか。 ListBoxで特定の項目に対するソートができるのかどうか。 以上の3点になります。 ■使用ツール Microsoft Visual Studio 2010 ■使用テンプレート WPFアプリケーション Visual C# その他、不足な情報等ございましたらなんなりと申しつけ下さい。 皆様のお知恵を参考にさせていただけたらと思っております。 よろしくお願いいたします。

  • エクセルVBA ListBox選択を反映させる

    いろいろ試みたのですが、分からないので教えてください ・ユーザーフォームにListBox1、ListBox2があります ・やりたいこと ●ListBox1=ListBox2場合、A2にListBox1の値を入力 (ex)ListBox1がH8 (1996)、ListBox2がH8 (1996)の場合、A2に「H8」と入力 ●ListBox1がListBox2と1年違う場合、A2とA3にその間の期間を入力 (ex)ListBox1がH8 (1996)、ListBox2がH9 (1997)の場合、A2に「H8」、A3に「H9」と入力 ●ListBox1がListBox2と2年違う場合、A2とA4にその間の期間を入力 (ex)ListBox1がH8 (1996)、ListBox2がH10 (1998)の場合、A2に「H8」、A3に「H9」、A4に「H10」と入力 ・作成したもの1 Private Sub ListBox1_Change()     With ListBox2     .Clear     Select Case UserForm1.ListBox1.List(ListBox1.ListIndex)     Case "H8 (1996)"       .List = Array("H8 (1996)", "H9 (1997)", "H10 (1998)")     Case "H9 (1997)"       .List = Array("H9 (1997)", "H10 (1998)")     Case "H10 (1998)"       .List = Array("H10 (1998)")     End Select     .ListIndex = 0     End With End Sub ・作成したもの2 If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 End If If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) + 1 = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1987 End If If Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) + 2 = Mid(ListBox2, Application.Find("(", ListBox2) + 1, 4) Then sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1988 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1987 sheets1.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "H" & Mid(ListBox1, Application.Find("(", ListBox1) + 1, 4) - 1986 End If ・困ったこと (1) ListBox1を選択した時、ListBox2の表示を切り替えられるようにしており、選択したように青になっていますが、実際はListBox2を選択していないようです ListBox1をH8にクリックしてから、ListBox2をH9やH10を選択して、再度H8を選択しなおさなければ、エラーになってしまいます (2)ListBox1とListBox2が1年違い、2年違いの場合、うまくいかずセルに入力されない もし分かる方がいらっしゃいましたら、教えてください よろしくお願いします

  • ListBoxのBackColor変更

    EXCEL2007のVBAにて質問です。 ユーザーフォームにリストボックスを配置して、選んだ物によって リストボックスの背景色を変更しようとしているのですが、うまくいきません。 例えばlistbox1を以下の様にセットし、 Private Sub UserForm_Initialize() UserForm1.ListBox1.AddItem ("ピンク") UserForm1.ListBox1.AddItem ("白") End Sub 下記の通り選んだ項目で背景色を変えたいのですが、 Private Sub ListBox1_Click() '選んだ項目で色変え If UserForm1.ListBox1.ListIndex = 0 Then UserForm1.ListBox1.BackColor = RGB(255, 128, 128) 'ピンクなら背景をピンクに Else UserForm1.ListBox1.BackColor = RGB(255, 255, 255) '白なら背景を白に End If End Sub クリックして項目を選択しても背景の色が変わりません。 何か見落としている事があるでしょうか? 又はやり方が悪いのでしょうか? お教え頂けると助かります。 以上、宜しくお願い申し上げます。

  • ユーザーフォームでのListBoxからの・・・

    Excelファイルを起動しシート上の様式に入力するユーザーフォームを初めて作成しております。 今回の質問ですが、フォーム上でのリストから合致する内容を別テキストボックスへ表示する様にしたいのですが御教授下さい。 ※VBA作成シート上ではVLOOKUP関数を使い使用しておりました。 例) ListBox1でリストで氏名を選択 → TextBox1へ氏名に合致するTEL番号表示  → 様式のセルへ転記 ※セルへの転記は心得ております。 Office2010 Win7での環境です。 初めてVBAをいじり、作動した時の喜びをニヤけながら作成しております。 どうぞ、よろしくお願いいたします。

  • VB2008 ListBox内項目の入れ替え

    VB2008で、ListBox内の項目をボタンで移動させるようにプログラムを組みたいのですが、うまくいきません。 一つの列には12個分の項目があります。 分かりにくい質問で申し訳ございませんが、回答よろしくお願いします。

  • windowsフォームアプリケーションについて

    windowsフォームアプリケーションについて 現在VC++のwindowsフォームアプリケーションを使ってマウスのみで作業ができる環境を作ろうとしてます。 その際に他のプログラムで作成した実行ファイルを外部アプリケーションとして system("C:\\~~\\--.exe") で表示させることに成功しました。 しかしこの実行ファイル(VC++で作成)はwhileループを用いているため途中で終了させることはできない仕組みになっています。 そこでこのwhileループを用いた実行ファイルをwindowsフォームアプリケーションのボタンクリックしたら終了するようなプログラムを作成したいのですがネットなどで調べてもコマンドが分からずに困っています。 アドバイスいただける方よろしくお願いします。

専門家に質問してみよう