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

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

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

Re[7]: WindowsCE でのコンテキストメニュー


(過去ログ 90 を表示中)

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

■53838 / inTopicNo.1)  WindowsCE でのコンテキストメニュー
  
□投稿者/ りぁ (1回)-(2010/09/28(Tue) 10:27:06)

分類:[C#] 

お世話になっています。
環境は以下の通りです。

開発環境 VisualStudio 2005
言語   C#
実行環境 Windows CE

コンテキストメニューの表示を行いたいのですが
うまくいきません。
リストビューを右クリックしたときに
「新規」のコンテキストメニュー
リストビューの項目の1つ目を右クリックしたときに
「修正」「削除」のコンテキストメニューを
表示したいです。

// リストビューマウスアップ時処理
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
// 右クリックでなければ終了
if (e.Button != MouseButtons.Right) return;

// クリック位置にあるアイテムを取得
ListViewHitTestInfo hitItem = listView1.HitTest(e.X, e.Y);

// クリック位置にアイテムがなければ「新規作成」追加
if (null == hitItem.SubItem)
{
contextMenu1.MenuItems.Add("新規作成");
}
// 1つめのカラムをクリックしたなら「修正」「削除」追加
else if (0 <= e.X && e.X <= listView1.Columns[0].Width)
{
contextMenu1.MenuItems.Add("修正");
contextMenu1.MenuItems.Add("削除");
}

// 表示するメニューがあればマウスカーソル位置にコンテキストメニュー表示
if (0 < contextMenu1.MenuItems.Count)
contextMenu1.Show(Cursor.Position);
}

このようにコーディングしたのですが、

エラー1 型または名前空間名 'ListViewHitTestInfo' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

エラー2 'System.Windows.Forms.ListView' に 'HitTest' の定義がありません。

エラー3 'System.Windows.Forms.Menu.MenuItemCollection.Add(System.Windows.Forms.MenuItem)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。

エラー4 引数 '1': 'string' から 'System.Windows.Forms.MenuItem' に変換できません。

エラー9 'System.Windows.Forms.Cursor' に 'Position' の定義がありません。

というエラーが出てしまいます。
3,4は同じエラーが全部で3回出てきます。
何が原因でしょうか?

また、「新規」のコンテキストメニューは
階層構造にしたいのですが
やり方がわかりません・・・。

よろしくお願い致します。
引用返信 編集キー/
■53839 / inTopicNo.2)  Re[1]: WindowsCE でのコンテキストメニュー
□投稿者/ Hongliang (719回)-(2010/09/28(Tue) 11:45:45)
.NET Compact Framework (CF) は、.NET Framework に比べ機能が制限されています。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview_methods(VS.80).aspx
ListView のメソッド一覧ですが、名前の左にアイコンが 1 〜 3 つあります。このうち、黄色枠に水色のアイコンが CF でサポートしているメソッドです。ご覧の通り、HitTest にはそのアイコンがありません。
Menu.MenuItemCollection.Add、Cursor.Position も同様に確認してください。

CF で ListView の HitTest をするには、多分 LVM_HITTEST を SendMessage する必要があります。
http://msdn.microsoft.com/en-us/library/aa453471.aspx
http://msdn.microsoft.com/ja-jp/library/8c5xx97k(VS.80).aspx

メニューの追加方法は、.designer.cs の #region で隠れてる部分を参照すればどういう風に書くのか分かると思います。階層メニューも、一度デザイナで作成してみて、同様に #region の中を調べてみてください。
// CF でも .designer.cs 作られるよね?

カーソル位置については、MouseEventArgs の e から引っ張ってくれば大体解決すると思います。
引用返信 編集キー/
■53844 / inTopicNo.3)  Re[2]: WindowsCE でのコンテキストメニュー
□投稿者/ よねKEN (621回)-(2010/09/28(Tue) 13:00:06)
よねKEN さんの Web サイト
> CF で ListView の HitTest をするには、多分 LVM_HITTEST を SendMessage する必要があります。
> http://msdn.microsoft.com/en-us/library/aa453471.aspx
> http://msdn.microsoft.com/ja-jp/library/8c5xx97k(VS.80).aspx

Chris Tacke - ListView HitTest implementation
http://blog.opennetcf.com/ctacke/2009/06/25/ListViewHitTestImplementation.aspx

それっぽいことをされているコード例があったのでURLを貼っておきます。


引用返信 編集キー/
■53846 / inTopicNo.4)  Re[2]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (2回)-(2010/09/28(Tue) 13:20:25)
No53839 (Hongliang さん) に返信
ありがとうございます。
> .NET Compact Framework (CF) は、.NET Framework に比べ機能が制限されています。
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview_methods(VS.80).aspx
> ListView のメソッド一覧ですが、名前の左にアイコンが 1 〜 3 つあります。このうち、黄色枠に水色のアイコンが CF でサポートしているメソッドです。ご覧の通り、HitTest にはそのアイコンがありません。
> Menu.MenuItemCollection.Add、Cursor.Position も同様に確認してください。
>
> CF で ListView の HitTest をするには、多分 LVM_HITTEST を SendMessage する必要があります。
> http://msdn.microsoft.com/en-us/library/aa453471.aspx
> http://msdn.microsoft.com/ja-jp/library/8c5xx97k(VS.80).aspx
>
少し調べてみます。

> メニューの追加方法は、.designer.cs の #region で隠れてる部分を参照すればどういう風に書くのか分かると思います。階層メニューも、一度デザイナで作成してみて、同様に #region の中を調べてみてください。
> // CF でも .designer.cs 作られるよね?
>
.designer.cs作られます。見てみます!

> カーソル位置については、MouseEventArgs の e から引っ張ってくれば大体解決すると思います。
調べてみます。

引用返信 編集キー/
■53847 / inTopicNo.5)  Re[3]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (3回)-(2010/09/28(Tue) 13:21:37)
No53844 (よねKEN さん) に返信
ありがとうございます。

> Chris Tacke - ListView HitTest implementation
> http://blog.opennetcf.com/ctacke/2009/06/25/ListViewHitTestImplementation.aspx
>
> それっぽいことをされているコード例があったのでURLを貼っておきます。
>
これはこのまま丸写しをしてもだめですよね?
これはHitTestというメソッド?クラス?を自分で作っているのですか?
引用返信 編集キー/
■53849 / inTopicNo.6)  Re[4]: WindowsCE でのコンテキストメニュー
□投稿者/ よねKEN (622回)-(2010/09/28(Tue) 13:42:35)
よねKEN さんの Web サイト
No53847 (りぁ さん) に返信
> ■No53844 (よねKEN さん) に返信
> ありがとうございます。
>
>>Chris Tacke - ListView HitTest implementation
>>http://blog.opennetcf.com/ctacke/2009/06/25/ListViewHitTestImplementation.aspx
>>
>>それっぽいことをされているコード例があったのでURLを貼っておきます。
>>
> これはこのまま丸写しをしてもだめですよね?

ダメかどうかは試してみてください。
#私は検証まではしていません。

再度見た感じではVC#2008以降向けに書かれているコードのようなので(C#の拡張メソッドの文法(※)が使われているので)、
VC#2005だと手直しは必要だと思います。
((※)C#の拡張メソッドの文法→staticメソッドの第一引数でthisの指定のある箇所)

> これはHitTestというメソッド?クラス?を自分で作っているのですか?

最初の説明文を読む限りでは、そうだと思います。

引用返信 編集キー/
■53850 / inTopicNo.7)  Re[5]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (4回)-(2010/09/28(Tue) 13:57:15)
No53849 (よねKEN さん) に返信
ありがとうございます。

> ダメかどうかは試してみてください。
> #私は検証まではしていません。
>
> 再度見た感じではVC#2008以降向けに書かれているコードのようなので(C#の拡張メソッドの文法(※)が使われているので)、
> VC#2005だと手直しは必要だと思います。
> ((※)C#の拡張メソッドの文法→staticメソッドの第一引数でthisの指定のある箇所)
いろいろ直してみました。

型または名前空間名 'ListViewHitTestLocations' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
型または名前空間名 'ListViewHitTestInfo' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

というエラーが出たのですがどうしたらいいのでしょうか?
引用返信 編集キー/
■53852 / inTopicNo.8)  Re[3]: WindowsCE でのコンテキストメニュー
□投稿者/ Hongliang (720回)-(2010/09/28(Tue) 14:05:59)
その二つの型を定義していないか、またはその二つの型が属している namespace が使用している型の namespace と異なるんでしょう。
引用返信 編集キー/
■53853 / inTopicNo.9)  Re[4]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (5回)-(2010/09/28(Tue) 14:22:41)
No53852 (Hongliang さん) に返信
ありがとうございます。
> その二つの型を定義していないか、またはその二つの型が属している namespace が使用している型の namespace と異なるんでしょう。
エラー消えました!
ですが新たにエラーが・・・

'OpenNETCF.Windows.Forms.ListViewHitTestInfo.Item.get' は abstract または extern に指定されていないため、本体を宣言する必要があります。
というようなエラーが6つ出ました。
原因は
public ListViewItem Item { get; set; }
public ListViewHitTestLocations Location { get; set; }
public ListViewItem.ListViewSubItem SubItem { get; set; }
この行です。
[abstract または extern に指定されていないため]
ということは、どちらかを指定すればいいのでしょうか?
引用返信 編集キー/
■53855 / inTopicNo.10)  Re[4]: WindowsCE でのコンテキストメニュー
□投稿者/ PATIO (19回)-(2010/09/28(Tue) 14:40:51)
基本的に「見つかりません」と出ている場合は、
その定義をコンパイラが見つけられないから出ているわけなので
エラーメッセージにあるように
「using ディレクティブまたはアセンブリ参照が不足しています。」
という話になります。

この辺はnamespace自体の理解とか、その定義がどういうnamespaceに
定義されているとかと言う部分の話なのでその部分の理解が怪しいのであれば、
C#の入門書等で再確認してみてください。
この辺のコンパイルエラーを解決するのは一番基本的な部分の知識の話になります。
理解が十分で無いのであれば、何度でも反復して理解を十分な物にする事を
お勧めします。

引用返信 編集キー/
■53856 / inTopicNo.11)  Re[5]: WindowsCE でのコンテキストメニュー
□投稿者/ PATIO (20回)-(2010/09/28(Tue) 14:46:28)
2010/09/28(Tue) 14:52:46 編集(投稿者)
2010/09/28(Tue) 14:52:06 編集(投稿者)
2010/09/28(Tue) 14:49:36 編集(投稿者)

No53853 (りぁ さん) に返信
> 'OpenNETCF.Windows.Forms.ListViewHitTestInfo.Item.get' は abstract または extern に指定されていないため、本体を宣言する必要があります。
> というようなエラーが6つ出ました。
> 原因は
> public ListViewItem Item { get; set; }
> public ListViewHitTestLocations Location { get; set; }
> public ListViewItem.ListViewSubItem SubItem { get; set; }
> この行です。
> [abstract または extern に指定されていないため]
> ということは、どちらかを指定すればいいのでしょうか?

基本的に開発環境として提供されているファイルを修正することはありえません。
もしエラーが出ているとしたら使い方を間違えているか、間違ったファイルを使用しているか
そんな所だと思います。

あと、abstractとかexternに指定すると言う意味は理解されていますか?
なぜそういうエラーが出ているのでしょう?
もう一歩踏み込んで考えないと本当の原因がつかめないと思いますよ。
エラーを直す事は必要なことですが、何が原因でエラーが起こっているのかを
理解した上で修正しないと別の場所で同じエラーが起きた時に正しい対処が出来ないと思います。

引用返信 編集キー/
■53857 / inTopicNo.12)  Re[6]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (7回)-(2010/09/28(Tue) 14:57:48)
No53856 (PATIO さん) に返信
充分な理解が出来ないまま作成しろと言われたので
エラーの原因など全くわかりません。
作成の期限も迫っていていろいろ調べている時間が無く
質問させてもらいました。
すみませんでした。
エラーがなぜ起きるかなどはこれから勉強していこうと
思いますので、教えていただけたらと思いました。
ずうずうしくてすみません。
引用返信 編集キー/
■53861 / inTopicNo.13)  Re[5]: WindowsCE でのコンテキストメニュー
□投稿者/ よねKEN (623回)-(2010/09/28(Tue) 15:27:19)
よねKEN さんの Web サイト
2010/09/28(Tue) 15:36:38 編集(投稿者)

No53853 (りぁ さん) に返信
> 'OpenNETCF.Windows.Forms.ListViewHitTestInfo.Item.get' は abstract または extern に指定されていないため、本体を宣言する必要があります。
> というようなエラーが6つ出ました。

プロパティの宣言部分がVC#2005(C#2.0)的に間違っているために発生しているエラーです。
(C#2.0のコンパイラにとってはabstractを付け忘れているのでは?と指摘されるような形のコードになっているため、
上記のようなエラーメッセージがでます)

> 原因は
> public ListViewItem Item { get; set; }
> public ListViewHitTestLocations Location { get; set; }
> public ListViewItem.ListViewSubItem SubItem { get; set; }
> この行です。

VC#2008(C#3.0)からは自動プロパティが導入されていますが、上記はその文法で書かれたコードです。

例えば、
> public ListViewItem Item { get; set; }
この1行は以下のようなコードに相当します。(掲示板上で書いているので未コンパイルです)

private ListViewItem _item;
public ListViewItem Item { get { return _item; } set { _item = value; } }

不明点は「C# 自動プロパティ」で検索してください。
後、それ以外にも新機能を使っているかもしれませんので
「C#3.0 新機能」で検索してバージョン間の文法の差を確認してください。


引用返信 編集キー/
■53864 / inTopicNo.14)  Re[6]: WindowsCE でのコンテキストメニュー
□投稿者/ C# (12回)-(2010/09/28(Tue) 16:11:33)
2010/09/28(Tue) 16:12:18 編集(投稿者)


引用返信 編集キー/
■53865 / inTopicNo.15)  Re[7]: WindowsCE でのコンテキストメニュー
□投稿者/ りぁ (9回)-(2010/09/28(Tue) 16:12:41)
No53861 (よねKEN さん) に返信
ありがとうございます。

> 例えば、
>>public ListViewItem Item { get; set; }
> この1行は以下のようなコードに相当します。(掲示板上で書いているので未コンパイルです)
>
> private ListViewItem _item;
> public ListViewItem Item { get { return _item; } set { _item = value; } }
この書き方でこの場所のエラーは消えました。
また新たに11個のエラーが出てしまいました・・・
エラーは自分で調べてみます。またわからなかったら質問させていただきます・・・


最初の話に戻るのですが、
> コンテキストメニューの表示を行いたいのですが
> うまくいきません。
> リストビューを右クリックしたときに
> 「新規」のコンテキストメニュー
> リストビューの項目の1つ目を右クリックしたときに
> 「修正」「削除」のコンテキストメニューを
> 表示したいです。
の件ですが、HitTestなどを使わず、他にやり方はあるのでしょうか?
もしあるようでしたら教えてください。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -