トップページ⇒tech
1001コメント308KB

C♯, C#相談室 Part35

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/03(金) 03:07:45
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C♯, C#相談室 Part34
http://pc8.2ch.net/test/read.cgi/tech/1157549657/

過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0183デフォルトの名無しさん2006/11/09(木) 17:48:24
>>181
C#語でおk
0184デフォルトの名無しさん2006/11/09(木) 18:32:49
フラグで判断。
0185デフォルトの名無しさん2006/11/09(木) 19:33:59
>>178
BeforeNavigate2 イベントに POST されるデータも入ってる。
Interop.SHDocVw.dll 参照して ActiveXInstance を SHDocVW.WebBrowser にキャストしてイベント使用するか
CreateSink でイベントシンク作るかしないと使えないが。
0186デフォルトの名無しさん2006/11/09(木) 20:21:53
>>185
面倒だから素直にAxBrowser使ったら?
素直にBeforeNavigate2使えるし。
0187デフォルトの名無しさん2006/11/09(木) 21:33:49
>>185
なるほど〜、SHDocVW.WebBrowserにキャストすればいいんですね。
ふつうに
SHDocVw.WebBrowser browser = (SHDocVw.WebBrowser)this.ActiveXInstance;
browser.BeforeNavigate2 += new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(browser_BeforeNavigate2);
とかやってでBeforeNavigate2イベントのフックおよびPOSTデータ取れました。
0188デフォルトの名無しさん2006/11/09(木) 23:54:47
クラスやメソッドの説明のためのコメントで良いフォーマットありませんか?
0189デフォルトの名無しさん2006/11/10(金) 00:01:04
ドキュメントコメントじゃあかんの?
0190デフォルトの名無しさん2006/11/10(金) 06:52:57
>>188
コメントそのもののフォーマットを求めているならヘルプのそれを参考にすれば?
たとえばプロパティなら「〜を取得または設定します」みたいな。
0191デフォルトの名無しさん2006/11/10(金) 11:46:54
お願いします。誰か多重継承を許容する言語作ってください。
0192デフォルトの名無しさん2006/11/10(金) 11:58:40
>>191
多重継承を許容すると退化することになる。

新しいスキームが必要。
0193デフォルトの名無しさん2006/11/10(金) 12:10:03
>>191
CLOS系のやつ

シバリがなくなるだけで退化にはならんと思う。
漏れは色んなパラダイムを許容する言語の方が好きだ。
0194デフォルトの名無しさん2006/11/10(金) 12:13:47
すれ違いだけど…
多重継承で同じインターフェイス含んだクラス2つ継承したら、
動作はどうなるの?

0195デフォルトの名無しさん2006/11/10(金) 12:16:49
言語によるんじゃね?
C++なら部分オブジェクトを共有するか別々にするか制御できるよね。
スレ違いスマソ
0196デフォルトの名無しさん2006/11/10(金) 12:38:16
バグ出にくくなって、コーディングが楽になるならなんでもいいよ。
0197デフォルトの名無しさん2006/11/10(金) 16:19:21
選べりゃいいと思うんだけどね。
ひとつしか実装なかったらそれが呼ばれて明示的実装あればそっちが呼ばれる。

副作用よりも記述性のメリットが勝ると思うんだけど。
複数クラスに委譲コードこぴぺするほうがバグでるっちゅーねん。
0198デフォルトの名無しさん2006/11/10(金) 16:25:51
開発陣が多くなると多分死ぬはめに…
0199デフォルトの名無しさん2006/11/10(金) 17:45:42
プロパティのset呼び出しをデリゲートに渡したいんだけどどうしたらいいでしょう?
float Width{set{_width=value;}}
っていうプロパティがあるんですが、
floatを引数にもつデリゲートが他の変数に代入しようとしても
_deleg=Width;はだめだし
_deleg=set_Widthもだめ。
0200デフォルトの名無しさん2006/11/10(金) 18:42:08
・・・メソッドでくるめば?
0201デフォルトの名無しさん2006/11/10(金) 19:14:56
>>199
言ってることおかしくないかな?
0202デフォルトの名無しさん2006/11/10(金) 19:28:01
自由度が高くなっても >>199みたいなこと
言うやつが増えるだけじゃないのかな?
0203デフォルトの名無しさん2006/11/10(金) 19:46:14
僕の考えたオリジナル仕様?
0204デフォルトの名無しさん2006/11/10(金) 22:37:01
リフレクションでないと出来なかったかな?
0205デフォルトの名無しさん2006/11/10(金) 23:21:00
.NET Framework 3.0の中身をのぞいてみよう!
デジタルアドバンテージ 一色 政彦
2006/11/11

PS3並みのフライング?
0206デフォルトの名無しさん2006/11/11(土) 01:08:56
>>205
何が?<フライング

.NET Framework 3.0、もう正式版出てるし、
β版とか CTP 版はずいぶん前からあるし。
0207デフォルトの名無しさん2006/11/11(土) 01:16:34
>>206
記事の日付と書き込み日時
0208デフォルトの名無しさん2006/11/11(土) 01:32:59
ワロタ
0209デフォルトの名無しさん2006/11/11(土) 01:48:57
@ITはいつもそうだけどな
0210デフォルトの名無しさん2006/11/11(土) 02:25:49
いつものこと
0211デフォルトの名無しさん2006/11/11(土) 12:08:58
フォームのキーダウンイベント発生しないけどなんでー

private void Form1_KeyDown( object sender, KeyEventArgs e )
{
switch ( e.KeyCode ) {
case Keys.Left:
rects[0].X -= 25;
rects[1].X -= 25;
rects[2].X -= 25;
rects[3].X -= 25;
break;

case Keys.Right:
rects[0].X += 25;
rects[1].X += 25;
rects[2].X += 25;
rects[3].X += 25;
break;
}
}
}

すいっちのとこにブレーク張ってるのにキーボードのキー入力しても
イベントハンドラに�dで来ないお
これだから馬具だらけのC#はきらいだ!!!
0212デフォルトの名無しさん2006/11/11(土) 12:10:28
ちなみに2005使ってる
やっぱフリーのだから馬具ありなのかな、外地?
0213デフォルトの名無しさん2006/11/11(土) 12:12:25
コントロールの方に飛んでるだけだろ
0214デフォルトの名無しさん2006/11/11(土) 12:18:51
>>211
初心者スレ池
0215デフォルトの名無しさん2006/11/11(土) 12:27:49
>>213
違いますよ^^;
ちゃんとフォームにフォーカス当ててる
0216デフォルトの名無しさん2006/11/11(土) 12:30:52
>>214
みつからないんだが紹介してくれ、そっちで質問するから
0217デフォルトの名無しさん2006/11/11(土) 12:53:12
>>216
Form.KeyPreview
0218デフォルトの名無しさん2006/11/11(土) 12:59:18
そんなスレッドはないようですが・・・
できればurlをお願いいたします(ぺこりー
0219デフォルトの名無しさん2006/11/11(土) 13:09:19
>>218
ふらっとC♯, C#(初心者用) Part10
http://pc8.2ch.net/test/read.cgi/tech/1162193452/

だが>>217が答えだ
0220デフォルトの名無しさん2006/11/11(土) 13:16:08
>>219
どーも。
ボタンを押したときのイベントで>>217の
 Form.KeyPreview = true;
というのを追加したけどコンパイルエラーになる。
変数はForm1という名前だから
 Form1.KeyPreview = true;
とやっても怒られる。
 this.KeyPreview = true;
でコンパイルが通った!
でもやっぱりだめなんだな、これが。
やっぱり>>211のイベントに�dで来ないお
試しにみんなもやってみてくれ、
もしバグだったら誰か舞糞に連絡ヨロ
0221デフォルトの名無しさん2006/11/11(土) 13:17:32
>>220
プログラム言語の勉強を一からやることをお勧めする
0222デフォルトの名無しさん2006/11/11(土) 13:24:02
       \
         \∩─ー、    ====
         /\● 、_ `ヽ   ======
        /   (0o)  ● |つ    ちょっ! ちょっと待つクマ!
        |   (_入__ノ   ミ
         、  (_/   ノ /⌒l  釣り方間違ってるクマ!!
         /\___ノ゛_/  /  =====
         〈         __ノ  この吊り方は、やばすぎるクマー!!
         \ \_    \    ===
          \___)     \   ======   (´⌒
             \   ___ \__  (´⌒;;(´⌒;;
               \___)___)(´;;⌒  (´⌒;;  ズザザザ
0223デフォルトの名無しさん2006/11/11(土) 13:28:01
>>219氏以外みんななんちゃってC#プログラマでわからないってことで
>>219氏の教えてくれたスレに移動するからここでの質問は取り下げるお
お世話様ですた
0224デフォルトの名無しさん2006/11/11(土) 13:30:22
>>223
>>222
釣りならそういえよw
0225デフォルトの名無しさん2006/11/11(土) 13:49:53
>>221
いやあんなの一生プログラミングに触って欲しくないな
0226デフォルトの名無しさん2006/11/11(土) 13:56:22
質問です。

C#+asp.net2.0でプログラムかいてます。で、あるページでGridViewを使ってるんですが動作がおかしいです。

画面にはGridViewと更新ボタンがあります。Gridviewにはデータバインドしてるのとテンプレートフィールドがあります。
テンプレートフィールドはチェックボックスになってて、チェックボックスをオンにした状態で更新ボタンを押すとその状態がDBに記憶され、
次同じページを開いたときはチェックボックスがオンになった状態でページが開かれます。

更新ボタンのイベントではまずDBにある全てのデータを消してからGridView全てのRowを見て
Checkbox.checked=trueのものだけDBに保存する仕様になってます。

しかしここで問題が…。チェックボックスがオフの状態からオンの状態にして更新ボタンを押すとうまく反映されるのですが、ページを開いた状態のときにすでにオンになってるチェックボックスをオフにして更新を押すとDBに反映されません。

原因を調べたところチェックボックスをオフにしたはずなのに条件判定のところではチェックボックスがオンの状態になっているようでした。これはなぜでしょうか?

わかる人いらっしゃったら教えてください。お願いします。
0227デフォルトの名無しさん2006/11/11(土) 14:04:23
Page_LoadでデータバインドしてるとこでIsPostBackがfalseのときだけやるようにする。
とエスパーなりきって考えてみた。
02282262006/11/11(土) 14:17:59
>>227
書き忘れてましたが更新ボタンを押した後は「更新されました」というページに遷移するようになってます。なのでpostbackは関係ないかもしれません…。

ページがロードされたときにDBに項目があるものに関してはチェックボックスをオンにするということをしてますが、
それでオンになった項目をオフにして更新ボタンを押しても、そのイベントハンドラ内ではチェックボックスがオンだと認識されているところに問題があるんだと思いますが、なぜかがわかりません…。
02292112006/11/11(土) 14:25:56
http://pc8.2ch.net/test/read.cgi/tech/1162193452/
の(口は悪いが)親切な回答者のおかげで解決したよ、
このスレは本当に役立たずな回答者しかいないな、
二度と来る門下
0230デフォルトの名無しさん2006/11/11(土) 14:27:33
KeyPreview教えたのもすれ誘導したのも
役立たず。
0231デフォルトの名無しさん2006/11/11(土) 14:37:20
>Form.KeyPreview = true;
>というのを追加したけどコンパイルエラーになる。
>変数はForm1という名前だから
>Form1.KeyPreview = true;
>とやっても怒られる。
>this.KeyPreview = true;
>でコンパイルが通った!

>Form.KeyPreview = true;
>というのを追加したけどコンパイルエラーになる。
>変数はForm1という名前だから
>Form1.KeyPreview = true;
>とやっても怒られる。
>this.KeyPreview = true;
>でコンパイルが通った!

>Form.KeyPreview = true;
>というのを追加したけどコンパイルエラーになる。
>変数はForm1という名前だから
>Form1.KeyPreview = true;
>とやっても怒られる。
>this.KeyPreview = true;
>でコンパイルが通った!

こんなレベルなのに文句を言う方がどうかしてるな。
0232デフォルトの名無しさん2006/11/11(土) 15:10:46
スルー
↑
これくらいいい加減読めるようになろうぜwww
0233デフォルトの名無しさん2006/11/11(土) 15:13:17
そうだね
プロテインだね
0234デフォルトの名無しさん2006/11/11(土) 15:19:46
>>226
コードのロジックミスじゃないの?
0235デフォルトの名無しさん2006/11/11(土) 15:24:20
>Checkbox.checked=trueのものだけDBに保存する仕様になってます。
この投稿の段階で怪しい。

あげ足取りごめんね!!
02362262006/11/11(土) 15:46:08
>>234
一応更新ボタンのイベントハンドラにはまずDBの全ての内容をdeleteして、その後foreachで全てのrowを見てチェックボックスがオンならDBにタプルを追加するという方法を取ってます。これがいけないんでしょうか?

>>235
実際はrowからcheckboxオブジェクトを取ってそれのcheckedをチェックしてます。
0237デフォルトの名無しさん2006/11/11(土) 16:30:37
だからLoadとかで常にDBから読んじゃってんじゃないの?
って思うんだが。
0238デフォルトの名無しさん2006/11/11(土) 17:15:07
TreeNodeのNodes[string key]ってどうやって使うんでしょうか。
02392262006/11/11(土) 17:24:49
>>237
うお!本当だ!

初心者で申し訳ありませんでした。更新ボタンを押したときそのボタンのイベントハンドラのみが呼び出されると思っていたのですが、
その前にpage_loadが呼び出されてるんですね…。

僕の仕様だとpage_loadのところでGridViewの全てのRowをチェックしてそれがDBにあった場合チェックボックスをtrueにするので一度消したやつも再度チェックがオンになってしまっているようです。

isPostBackを使うことで解決しました。こんな初心者に助言していただいて本当にありがとうございました!
0240デフォルトの名無しさん2006/11/11(土) 17:35:42
>>238
TreeNodeCollection.Item プロパティ (String) だね
いつの間にこんなものができたのやら。

keyはコレクションから取得する TreeNode のNameとなってるから
TreeNode作るときnameを設定しておけば良いだけじゃないのか?
0241デフォルトの名無しさん2006/11/11(土) 17:48:57
Page_Init
コントロールのプロパティを読み取るか、初期化します。

Page_Load
コントロールのプロパティを読み取って更新します。

0242デフォルトの名無しさん2006/11/11(土) 18:50:06
C#で、web操作のプログラムを組みたいと思ってます。

例えば、IEでグーグルに行って、検索文字に「ねこかわいいよねこ」と入れて、検索ボタンを押して、
表示された検索結果の一番上のリンクにジャンプする・・・といったような、web操作を実行できるよう
にしたいのです。

しかし、いったいどうやればいいのか見当もつきません。
まだC#を始めたばかりで、本屋で入門書を探しているのですが、そんなことのやり方を書いている
本も見あたりません・・・。

どうやればいいでしょうか?
0243デフォルトの名無しさん2006/11/11(土) 18:57:42
>>242
いきなりジャンプすんの?
それとも自分の画面に
「ねこかわいいよねこ」と入れて
自分の画面のボタン押せばその検索結果を出す

ってだけなら今はやりのweb2.0、グーぐるのウェブサービスを使えばできそうだけどな。
同じくamazonの検索機能もウェブサービスで公開されてるような気がするんだが。

0244デフォルトの名無しさん2006/11/11(土) 19:03:06
* HTTP についてちょっと調べる。
* Googleの検索結果のURLをながめる。
* Googleの検索結果のソースをながめる。
0245デフォルトの名無しさん2006/11/11(土) 19:03:43
>>243
すいません、えと、グーグルは例に出しただけで、実際は株取引の画面で、色々入力して、
自動注文みたいなことをしようと考えています。

やりかたが全くわかりません・・。
0246デフォルトの名無しさん2006/11/11(土) 19:05:13
手で色々操作してるところをパケットモニタでキャプチャして観察
0247デフォルトの名無しさん2006/11/11(土) 19:09:14
パケットモニタつうかプロトコルアナライザの類ね。
0248デフォルトの名無しさん2006/11/11(土) 19:20:02
皆さん、レスありがとうございます。

うーん パケットモニタとか、プロトコルアナライザなるものがサッパリ分かりません(´・ω・`)

ちょっと、調べてみます<(_ _)>ありがとうございました。
0249デフォルトの名無しさん2006/11/11(土) 19:20:05
株取引って・・・
htppsの操作なんて出来るの?
0250デフォルトの名無しさん2006/11/11(土) 19:23:22
そかhttpsか・・・中見えないじゃん。
0251デフォルトの名無しさん2006/11/11(土) 19:33:10
httpsなんて関係ない、ただのオートメーションでそ。
0252デフォルトの名無しさん2006/11/11(土) 19:34:50
ここの過去スレと参考URL読むべし…
★★★自動売買ソフトを作ろうぜ★★★ Part12
http://live19.2ch.net/test/read.cgi/stock/1159246240/
0253デフォルトの名無しさん2006/11/11(土) 19:37:41
>>245
>すいません、えと、グーグルは例に出しただけで、実際は株取引の画面で、色々入力して、
>自動注文みたいなことをしようと考えています。

これとグーぐるの画面出すのと何が共通してるっての?
どういう意味で例だしたのかさっぱりわからん
0254デフォルトの名無しさん2006/11/11(土) 19:44:29
大体おなじもんだよ。
俺もオートログインとか自動発注とかしてたからわかる。
ラジオボタンとかチェックするのなかなか分からなかったけどな。
0255デフォルトの名無しさん2006/11/11(土) 19:45:57
ようするに通信したいっていう話じゃなくて、プログラムでIEを操作したいってことじゃね?
文字入力して特定の場所をクリックしてみたいな。
0256デフォルトの名無しさん2006/11/11(土) 19:57:02
>>242
IEでのweb操作はあまり需要が無いので書籍等は出ていないと思います。
webbrowserはVS2005から追加されました。
その前まではAxWebBrowserかなんかで英文ドキュメント見ながらやるしかありませんでした。
いまは日本語ヘルプがあるのでそこから地道にやってみてください。

参考になるかどうかわかりませんがおすすめ。
ttp://peace.poosan.net/investor/workshop/order/
0257デフォルトの名無しさん2006/11/11(土) 19:59:10
なぁ、C丼とブービードトネトと、一体何が違うんだ?
0258デフォルトの名無しさん2006/11/11(土) 20:10:45
>>257
ちょっと文法が違うだけで
使うクラスライブラリはほぼ同じ(ただしVBにはMyがあるけど)
好みの問題じゃね。
0259デフォルトの名無しさん2006/11/11(土) 20:22:44
すいません、友人にプログラムのさわりだけ教えるために
一応c#のexpressedhitionでアドレス帳でも作ってもらおうかと思ってるんですが、
その際のDBも簡易的なものでできたらなと思っています。

,mdfファイルを作るまでをできたのですが
こいつにアクセスしてデータを読み書きしてみたいのですが
どのようにすればいいでしょうか?

感じ的にはログイン認証みたいなことをしたいなぁと思っているのですが。
0260デフォルトの名無しさん2006/11/11(土) 20:38:38
ごめんなさい。

本を買えの一言です。
02612572006/11/11(土) 20:42:15
>>258
そうだよな。thx
0262デフォルトの名無しさん2006/11/11(土) 20:48:42
>>260
こういう一言書くぐらいなら単純にフル無視したらいいのにとたまに思う。
0263デフォルトの名無しさん2006/11/11(土) 20:48:55
さわりとは物事の本質を示す
0264デフォルトの名無しさん2006/11/11(土) 20:57:00
>>259
ADO.NET、接続文字列、SqlConnection、DataSetあたりでぐぐれ。
0265デフォルトの名無しさん2006/11/11(土) 20:59:05
>>259
友達w?


正直に言えよw
0266デフォルトの名無しさん2006/11/11(土) 22:02:48
>>265
あ、そっち?
大丈夫ごめんごめん。

会社ではOraleDBだったり今はSQLServerだったり
DBサーバにつないで、dataadapter使ってデータのやり取りやってるんだが、
単純にそういう環境なしのローカル環境だけの簡単なもの、っていうと
実務では殆ど使わないので実はあまりなじみなくってね。

初心者用の本でもありゃわかるんだろうが、そういう本はないw

結局普通にDataTAbleAdapter使ってデータのやりとりやることにしたよ。
DataSetに入れてしまえばあとはすぐだし。

その辺は「おまじない」とか言って適当にごまかしとくわw

最初から色々教えてやると頭パンクするかもしれんから。
0267デフォルトの名無しさん2006/11/11(土) 22:09:32
>>264
ローカルにsqlserverたてれたらそら簡単だが。。
ExpressEditionでできることって限られてるじゃん?

SqlServerもクライアントの機能しかないし。
てなると、完全にローカルだけで動かす環境。
Accessも手元にないし、どうしたもんかなぁ、と思ってたんだが。

ローカルデータ用の空のデータベースっつーのが項目として追加できたんで、
それ使ってなんとかやってみたよ。

ローカルデータ用の空のデータベースもSqlConnectionクラス使って
普通にコネクション設定したら使えるのかな?
コネクションはローカル用空DB(.mdfファイル)も
普通に別のDBサーバのDBも書き方同じなんだろうか。

ローカルのDB使ってプログラムなんか普通作らないからなぁ。
0268デフォルトの名無しさん2006/11/11(土) 22:16:13
すいません、質問です。

C#でCheckboxの値を変えられなくする(灰色表示にする)方法ってenable=falseにする以外はありませんか?
0269デフォルトの名無しさん2006/11/11(土) 22:23:23
なぜ?
0270デフォルトの名無しさん2006/11/11(土) 22:27:35
>>268
ほんと、なんで?って感じ
なぜEnabled = falseが嫌いなの?

方法ってたら、SendMessageでメッセージ送るとか?
02712682006/11/11(土) 22:28:59
>>269
postbackしたときにfalseにしたものはrequest.formに含まれなくなったようなのです。それはこれが原因ではないのでしょうか?
0272デフォルトの名無しさん2006/11/11(土) 23:27:24
>>268
ロックってなかったっけ?
灰色にしたくない、て言うのだと良くある質問かなと思ったけど(文字が見えにくくなるとか)
0273デフォルトの名無しさん2006/11/11(土) 23:34:36
最低限 Webで、とか書け。

最近こんなやつばっか。
02742682006/11/12(日) 00:31:56
すいません、Webでです。

ふむぅ、なんかできないみたいなので他の手段をとってみます。ありがとうございました。
0275デフォルトの名無しさん2006/11/12(日) 00:48:23
TableAdapterでUpdateしたんだが、コミットってどうする?
どうやったら保存されるの?
0276デフォルトの名無しさん2006/11/12(日) 01:10:53
標準でcomitしなくても更新できるんじゃなかったっけ。
トランザクション実行してるの?
0277デフォルトの名無しさん2006/11/12(日) 01:12:41
DatabaseDataSetTableAdapters.ADRESSTableAdapter uadpter = new WindowsApplication1.DatabaseDataSetTableAdapters.ADRESSTableAdapter();
DatabaseDataSet ds = new DatabaseDataSet();
DatabaseDataSet.ADRESSDataTable dt = new DatabaseDataSet.ADRESSDataTable();

//データ追加
DatabaseDataSet.ADRESSRow row = ds.ADRESS.NewADRESSRow();

row.NAME = this.txtName.Text;
row.ARESS1 = this.txtAdress1.Text;
row.ADRESS2 = this.txtAdress2.Text;
row.BIKO = this.txtBiko.Text;
row.TEL = this.txtTell.Text;

ds.ADRESS.AddADRESSRow(row);

uadpter.Update(ds.ADRESS);


としてみたんですが、データが反映されません。
なんか最後のところがへんちくりんなんでしょうかね?
0278デフォルトの名無しさん2006/11/12(日) 01:35:59
そのdtは何のため…
0279デフォルトの名無しさん2006/11/12(日) 01:36:57
ローカルのDBをコピーして上書きしちゃってたりして
0280デフォルトの名無しさん2006/11/12(日) 04:53:03
ぐはぁ、
なんかbinのdebugの下にデータベースのコピーできてるやんけ!
一生懸命ちゃうとこみとったわい。
デバッグモードのときはこっちのDBに書き込まれるとかそゆこと?どうなってんだ。
02812112006/11/12(日) 09:45:17
きみたち必死になってForm.KeyPreviewという回答をくれたけど
実は違うみたいれつよ(藁
後学のためにきみたちのもおいらが調べた結果をまとめたので教えてあげよう

「Windowsアプリケーションで方向キーなどの特殊キーを処理するには?」 by 149

1.Buttonコントロールで方向キーが処理できない理由
 Buttonコントロールでの方向キーの入力が、通常のKeyDownなどのキー・イベントで処理できないということは、
「方向キーが通常の入力キー(以降、普通入力キー)とは異なる」ことを意味する。Buttonコントロールの方向キーは
「プリプロセス(=前処理)を必要とする特殊な入力キー」(以降、特殊入力キー)である。

 これは、すでにプリプロセスで何らかの処理を実行済みなので、さらにその後でキー処理を行う必要がないからだ。
例えば、Buttonコントロールで[↓]キーを押すと、Windowsアプリケーションはプリプロセス工程で自動的にフォーカス移動の
処理を実行する。よって、その後でKeyDownイベントを処理する必要はなくなる。

 しかし、実際のアプリケーションでは、そのような通常のアプリケーション動作をカスタマイズしたい場合がある。例えば、
通常のアプリケーション動作では[↓]キーでフォーカス移動すると、そのフォーカス移動先がGroupBoxコントロールなどにより
設定されたグループ内でループするようになっているが、それをカスタマイズして、グループを越えてフォーカス移動するように
したい場合などが挙げられる。

  a) プリプロセス工程における処理をカスタマイズする
  b) 特殊入力キーを普通入力キーに変更する

ここではa)について解説する。

2.プリプロセス工程における処理をカスタマイズする
 プリプロセスをカスタマイズするには、フォームのProcessDialogKeyメソッドをオーバーライドして、そのメソッド内でキー処理を
行えばよい。もちろんフォームではなく、コントロールのProcessDialogKeyメソッドをオーバーライドしても同様の結果が得られる。
 次のコードは、実際に、フォームのProcessDialogKeyメソッドをオーバーライドした例である。この例では、方向キーでグループを
越えたフォーカス移動を行うように、処理をカスタマイズしている。

続く
02822112006/11/12(日) 09:46:29
protected override bool ProcessDialogKey(Keys keyData){
switch (keyData) {
case Keys.Down:
case Keys.Right:
this.SelectNextControl(
this.ActiveControl, true, true, true, true);
break;
case Keys.Up:
case Keys.Left:
this.SelectNextControl(
this.ActiveControl, false, true, true, true);
break;
default:
return base.ProcessDialogKey(keyData);
break;
}
return true;
}

ProcessDialogKeyメソッドをオーバーライドしたサンプル・プログラム(C#)

 なお、ProcessDialogKeyメソッドはコントロール→フォームの順で呼ばれる。ProcessDialogKeyメソッドでは、
独自にキーを処理した場合には、それを示すために戻り値でTrueを返すようにする。
 また、コントロールのProcessDialogKeyメソッドは、コントロールのPreProcessMessageメソッドから暗黙的に
呼び出される。そのため、プリプロセス工程の最初のメソッドであるコントロールのPreProcessMessageメソッドを
オーバーライドしても、同様にプリプロセス工程でのキー処理をカスタマイズできる。しかし、コントロールの
ProcessDialogKeyメソッドやPreProcessMessageメソッドをオーバーライドする方法を採用する場合、当然、
コントロールの継承が必要になる。

-------------------------------------------------------------
以上だ。いかにもC#のことなら何でも知ってる見たいなツラして回答者ぶるなら
少しは勉強しろよな(禿藁
0283デフォルトの名無しさん2006/11/12(日) 09:58:15
そうだね
■ このスレッドは過去ログ倉庫に格納されています