- 1 名前:デフォルトの名無しさん [2008/04/22(火) 00:31:59 ]
- (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。 前スレ C#, C♯, C#相談室 Part45 pc11.2ch.net/test/read.cgi/tech/1200911737/ その他テンプレ>>2-5くらい
- 205 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:53:21 ]
- >>203
つってもインスタンスを大量生産するための鋳型以上の意味もないだろ?
- 206 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:55:38 ]
- >>175
ひょっとしてインターフェイスと書くところをインスタンスにしてしまって 引っ込みが付かなくなったとか。それなら文脈があうが・・・
- 207 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:57:38 ]
- >>206
インターフェイスもインスタンスの一つと見なしてよいものだよ。 インターフェイスは取得するものだ。
- 208 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:58:17 ]
- >>207
またまた荒れるような書き方をするな。
- 209 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:59:06 ]
- いったい君たちは何の話をしてるの?
誰か頭のいい人ドラゴンボールに例えてくれよ
- 210 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:00:06 ]
- ドラゴンボールの主人公はヤムチャなのか天津飯なのかと言う話
- 211 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:27:53 ]
- 実装と概念は分離して語れよ
- 212 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 22:30:20 ]
- ↑といいつつ乖離して語る馬鹿
- 213 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:10:09 ]
- 主役はキーボードを打つキミだ!!
- 214 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:52:33 ]
- >>209
サイヤ人→クラス 悟空→インスタンス
- 215 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 01:57:38 ]
- スーパーサイヤ人→スーパークラス
- 216 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 04:08:51 ]
- ブルー将軍→サブクラス
- 217 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 06:42:59 ]
- クラスもメタクラスのインスタンスだから、
インスタンスが主役ということでおk、みたいな話か?
- 218 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 06:58:38 ]
- 決定的な違いは、メタ視点を持てているかどうかだろうな
明らかに不自由な設計やコーディングをしているのは明白なのだが 目が見えていないので、それを理解するのが困難になっているような気がする。
- 219 名前:163 mailto:sage [2008/05/14(水) 09:30:42 ]
- 皆さん、いろいろとアドバイス頂き有難う御座います。
すこしスレが荒れ気味ですが、これは私の無知を175さんが丁寧に ご指導してくださった点から始まっているかと思います。 原因は私にあります。スレを汚して申し分けありません。 最近良く思うのですが、OOPの浸透が何故遅いかと、 1)基本概念と実装に大きな開きがありすぎる。 2)考え方に様々な歴史や諸説があり、人や本によって解釈が異なる。 (人によって解釈が異なるのは、読んだ本の年代が大きく依存しているんでしょうか・・) の2点に集約してるかと思います。 OOPが不慣れなものにとっては 具体的な実装論はなかなか本の中には出てこず、 また、こーいう現場的な定石というのか考え方が定まらなくて、 悩んでいることが多いんです。 だから、175さんを始め皆様より貴重なアドバイスを頂いた件は、 非常に感謝しております。 インスタンスの件は、2論に分かれているかと思いますが、 これは馬鹿な私にでも分かるように説明した為の、言葉の綾かと思います。 長文になってしまい申し訳ありません。 とても勉強になりますた。 皆様を師匠と仰ぎ、また伺わせて頂きます!!
- 220 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 12:43:48 ]
- くだらない哲学論争は後回しにして、とりあえずクラスの利便性(哲学論争クンはこういう言い方に反発するようだけど)
を体得するのがいいと思うよ。っていうかそれが一番重要。 大して難しいことじゃないから使ってれば自然とわかるよそれは。 くれぐれもOOPを外から強制された義務的なものに過ぎない、などと考えないこと。 便利だから使われてるんだよ。 OOPが浸透してないとは俺には思えないけど、もしそうであるのなら それはOOPが「つかえねえ」からじゃなくてこの業界に馬鹿が多いからだよw
- 221 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:16:24 ]
- 質問です
UDPで受信したメッセージをテキストBOXに表示する処理の方法論です。 今は、UDP受信を別スレッドで受信して。セマフォー同期ででString変数に渡し。 フォームのプロセスで、タイマー関数からセマフォーを同期で文字列を受け取って テキストBOXに表示しています。 しかし、今一つスマートでないような気がしてなりません。もっと良い方法がないでしょうか?
- 222 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:38:37 ]
- 普通に Control.Invoke でいいんじゃねーの?
- 223 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:20:18 ]
- タイマースレッド内に、Invokeで受信部分を入れてみたのですが。
ダメみたいな感じでした。 問題点1 Invokeスレッドが終了しない。 問題点2 結局、セマフォーで受信の確認を取るので処理的に同じ。 ただし、使い方が悪いのかもしれない。 別スレッドから、フォームに非同期イベントが出せればいいのだけど、その方法を知らない。 きっと有るような気がします。すごく初歩的な機能かも知れない…
- 224 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:36:47 ]
- 223が何を言ってるのか全く分からない
Invoke スレッドて何?
- 225 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:14:15 ]
- >>224
んなこと言ったら、余計意味不明な説明が始まりかねん で、結論 Invokeの意味を理解できてない Invokeの使い方が間違っている
- 226 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:18:18 ]
- >>225
>Invokeの意味を理解できてない その可能性もある。 >Invokeの使い方が間違っている この問題にInvokeが適用できない。又は、別つの方法があるが使用したくない。 ちなみに、Invokeの中は一つのスレッドであることは理解していますよね?
- 227 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:54:08 ]
- >>221
Control.Invokeが解っていないなら、 codezine.jp/a/article.aspx?aid=139
- 228 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 17:32:06 ]
- >>222-227
出来ました。 結論:Control.Invokeが解っていなかった。無知でした。 申し訳ありません。そしてありがとうございました。
- 229 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:33:17 ]
- 本当の主役はテレビの前のあなたです!!m9ビシッ
- 230 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:31:56 ]
- 定数の取り扱いについての質問です。
定数宣言 public enum 定数 { MASU = 81, } 変数の定数宣言 public const int MASU = 81; この場合、配列列データ_創る場合。 private int[] tbl = new int[定数.MASU]; と private int[] tbl = new int[MASU]; どちらも同じに見えるのですが。前者を使用したほうがベターですか? 前者の方が速いですか?
- 231 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:37:25 ]
- enumハックを思い出した
- 232 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:46:14 ]
- キモい命名法だ
- 233 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:58:18 ]
- >>230
速さは一緒 値自体に意味があるならenumじゃなくてconstの方が適切 でもpublicならconstじゃなくてstatic readonlyにした方がいい
- 234 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:14:07 ]
- >>233
知らなかった知識です、ありがとうございます。
- 235 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:35:48 ]
- constと(static )readonlyは全く別物だから、
ちゃんと調べて使い分けるようにした方がいい
- 236 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:28:29 ]
- >>235
どこがどう違うかを書いた方がいい
- 237 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:44:41 ]
- 自分で書けよ
- 238 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 02:48:18 ]
- constに出来るものをstatic readonlyにした方がいい理由ってなんだよww
- 239 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:26:42 ]
- >>238
メモリの節約。
- 240 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 03:30:00 ]
- ↑アホ
- 241 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 06:17:51 ]
- 基本的にconstはクラス内でprivateに定義してその中だけで使用する。
constをアセンブリやnetmoduleまたがりで参照した場合、副作用がある。 S.DLLでpublic const A = 10 M.EXEで S.Aの表示 10 public const A = 99 に変更してS.DLLだけを再コンパイル。 M.EXEを再コンパイルしない限り結果は10のまま。
- 242 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 07:48:45 ]
- constを他のアセンブリから参照すると、参照元のアセンブリにも定数が埋め込まれる。後で値を変えたらさあ大変。
数学定数みたいに、絶対に値が変わることがないもの以外は、static readonlyにしたほうが無難。 あとはSizeとかDateTimeみたいに初期化の必要なものを、定数っぽく扱いたいときに。
- 243 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 09:05:11 ]
- それは完全に枝葉というか性質というか…全然別という意味分からないだろ
constはコンパイル時に値が確定される定数、readonlyは書き込み不可な変数。 見えてくる違いとしては、constはコンパイル時に評価されるので使える範囲がちょっと広い。 定数式しか許されない属性指定内部やswitchのcase句にも使用可能。これらに使用される場合境界越えで あってもconstにする必要がある。 ちなみにenumの個々の値はconstなのでenumを等価に置き換えるならconstになる。
- 244 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 09:25:48 ]
- enumの値が変わったら大変なことになるんだな
- 245 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 09:27:54 ]
- 外部に公開している列挙体を不用意に変更しちゃマズいのか。
- 246 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 10:09:30 ]
- >>242
これは知らなかった。勉強になる
- 247 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:15:35 ]
- ところでなんでcaseには定数しか書けないの?
- 248 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:33:21 ]
- 定数じゃないと、複数該当することもあるからじゃない?
まあ上から順番に比較するような仕様のやつもあるが。
- 249 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:34:50 ]
- あとジャンプテーブル変換
- 250 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 18:23:06 ]
- 実装を簡単にするための手抜き
- 251 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:20:36 ]
- かといってVBのSelectCaseは自由すぎると思わないか?
- 252 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:37:20 ]
- selectっていうのは0,1,2,3,4...
みたいに連番で並んでると それを関数ポインタの配列みたいにしてジャンプすることが出来る だから定数じゃないとどうしようもない
- 253 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 02:00:26 ]
- バカばっかw
- 254 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 08:37:30 ]
- ↑暴走中。
- 255 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:48:23 ]
- >>251
バグを引き起こしかねない問題を含まない限り、自由度は高いに越したことはないよ C#は新規なんだから、switch case の構文にこだわるべきじゃないとは思った もともと、switch は C の特殊 goto label の構文な訳だし、考え方が古臭すぎる。 for 文からの脱出に break を使いたくても、switchにとられてしまうとかダサいと思うので。
- 256 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:37:15 ]
- フォールスルー不可能にもかかわらずbreak必須って時点で(ry
- 257 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:38:59 ]
- たしかに。
この辺何とかならなかったのか。 C、C++からの移行を意識してるならswitch caseと別の構文にすればいいしな
- 258 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:57:33 ]
- >>252
stringにもswitchは使える その場合はif(str=="a") /*case a*/ else if(str=="b") /*case b*/ else if… みたいなコードにコンパイルされる
- 259 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 16:01:00 ]
- >>258
たくさんあるとDictionaryを使うらしいぞ
- 260 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 18:35:22 ]
- #regionはIDEで出来るようにした方がいいと思う。
- 261 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 18:49:50 ]
- それを言語そのものに組み込むところはC#の特徴というかアピール
IDEサポートを謳ってる言語なんだから
- 262 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 19:29:25 ]
- C#3.0の自動プロパティ作ると、[xxx]k_BackingField(うろ覚え)とかいうような変数が内部で生成されてるらしいんだが、これにソースコード上で属性を付加する方法ってありますか?
自動生成のプロパティにつけても自動生成される変数には付加されないみたいです。
- 263 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 19:54:51 ]
- >>261
C++にもあるよ。 てかそれなら両方サポートすればいいじゃん。
- 264 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 20:02:54 ]
- >>262
> 自動実装するプロパティ (C# プログラミング ガイド) > > 自動実装したプロパティでは、属性は使用できません。プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成します。
- 265 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 20:05:39 ]
- >>264 ('A`)マンドクセ
- 266 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:21:12 ]
- プログラミングC#っていう本を買おうかと思ってるんだけど
これ2年前に第4版が出たのが最後で、C#2.0対応とかVS2005対応とか書いてるよね もう今はC#3.5とかVS2008もでてるけど、近いうちに第5版とか出たりしそうかな? それとも第4版の内容でまったく問題ない?
- 267 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:27:06 ]
- 普通に考えれば最新の機能には対応してない。それだけだ
- 268 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:32:47 ]
- C#3.5って出てるの?
- 269 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:39:45 ]
- >>267
まあ、そうだね。サンクス >>268 ごめん、嘘ついた。NET Framework 3.5でもC#は3.0のままです ちょっと調べてたら原書のProgramming C# 3.0ってのは去年末にでてるんだな 日本語版でないかなー
- 270 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:43:57 ]
- 始めたばかりの俺はそれを待っている
今は猫と初めてを併用して学習中
- 271 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:02:27 ]
- 原書買えよ
- 272 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 02:10:19 ]
- 質問です。
DataGridViewで自動カラム生成機能ってありますけれど あれのカラムのフィールド名はこちらから指定できないんでしょうか? (特にReflectionを使った手法で) プロパティに属性つけるとかしたら上手くいくんじゃないかと思ってるんですが… ご存知の方いましたらお教えください。
- 273 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 03:11:04 ]
- 自動生成したらフィールドも何もないと思うが、
カラムのフィールド名って具体的に何を指してる? デザイナで列を追加したときにフォームに作られる Column*フィールドの名前のことか?
- 274 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 06:16:50 ]
- >>273
すいません、あまりにも説明不足でした。 フォームのカラムのヘッダに表示される文字列のことです。 プロパティ名がそのまま文字列変換されて表示されているようなので 多分どこかで設定できるんではと思っているのですが…
- 275 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 07:41:53 ]
- Select()でプロパティ名を変えた匿名型にすればいい
var e1 = ...; // 元のデータソース: IEnumerable<Hoge> var e2 = e1.Select(x => new { Bar = x.Foo, ... });
- 276 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 08:36:22 ]
- 知らない文法だなぁと思ったら2008ですか…。
ちょっと調べてみます。ありがとうございます。
- 277 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:45:58 ]
- Seleは2005でもあるんじゃ?
ラムダはデリゲートになおせばいいよ
- 278 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:47:00 ]
- Selectな
- 279 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:50:05 ]
- ごめん嘘だ
msdn.microsoft.com/ja-jp/library/bb548891.aspx 3.5からだった
- 280 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 22:57:12 ]
- 2005でも似たようなのを作ることは出来るがラムダ式がないと使い物にならない
- 281 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 06:12:12 ]
- 2008に慣れてしまって、もうLastOrDefault()相当のコードを書くことすら面倒くさい。
- 282 名前:デフォルトの名無しさん [2008/05/19(月) 14:21:56 ]
- WindowApplicationを作っています。
別スレッド(固定周期)でDBの値を引いてきて、Form(メインスレッド)のラベル.Text属性に値を設定する という処理を行なっていますが、 表示されるのは最初だけで、その後DBの値を変えてもラベルの値が変更されません。 どうしたらいいかご教授ください。
- 283 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 14:29:09 ]
- >>282
>>227と同じかな?
- 284 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 19:18:45 ]
- 同一のストリームをBinaryReaderとBinaryWriteに食わせた場合、
Closeを呼び出す順番ってどうすればいいの? ついでに、フィールドで持っているストリームをメソッド内のローカルの BinaryReader/BinaryWriterに食わせた場合、仮にメソッド内でClose呼んだりusingを使ったり することを避けたとしてもBinaryReader/BinaryWriterがGCに回収されるタイミングで ストリームも強制的に閉じられてしまうんだろうか?
- 285 名前:デフォルトの名無しさん [2008/05/19(月) 20:14:51 ]
- 今、関数の引数を設定したλ式を作る時、以下のようにしているのですが、
もっと良い方法または、ライブラリにこれと同様なことをするための物はあるのでしょうか? static Func<TResult> SetArg<T1,TResult>(Func<T1,TResult> f,T1 a1) { return () => f(a1); } ... static Func<TResult> SetArg<T1,T2,T3,T4,TResult>(Func<T1,T2,T3,T4,TResult> f,T1 a1,T2 a2,T3 a3,T4 a4) { return () => f(a1,a2,a3,a4) ; }
- 286 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:50:34 ]
- >>285
>static Func<TResult> SetArg<T1,TResult>(Func<T1,TResult> f,T1 a1) >{ > return () => f(a1); >} ライブラリに同等のものはないしもっと良い方法もない。 でもここにあげられたSetArgメソッドを使うぐらいなら a1 => f(a1) と毎回インラインで書けば十分だと思うよ。
- 287 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:57:42 ]
- >>285
今までC++使っていた人? C++がstd::bind1stやstd::bind2ndをありがたがって使っているのは 今までC++に簡潔なラムダ式が存在しなかったという特殊事情もあるので C# 3.0で無理してまねる必要は無いと思うよ。 C#だとSetArgみたいなのを作ってもインライン展開されないしね。
- 288 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 20:59:06 ]
- なんかすごいレベルの高い話してる・・・
- 289 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:00:24 ]
- 慣れてないだけだよ
解ればそんなに難しくない
- 290 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:10:48 ]
- >>284
Disposeは複数回呼び出されても大丈夫だから,続けて呼びさえしていれば問題ないんじゃね BinaryReaderやBinaryWriterはファイナライザを実装してないから それらがGCされるときにストリームが勝手に閉じられることはないよ ストリームへの参照がどこかで繋がってる限りは大丈夫
- 291 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:44:31 ]
- >>290
ありがと。
- 292 名前:デフォルトの名無しさん [2008/05/19(月) 21:55:05 ]
- >>286
実はそれがちょっとまずかったので、関数化したという事情があるんです、たとえば。 List<Func<int>> list ; for(int i=0;i<100;i++) { Func<int> tmp = () => i + 5 ; list.Add(tmp) ; } とすると、プログラムする側の気持ちとしては i には 1 , 2 , 3 , 4 , 5 となって欲しいのですが 計算が遅延しますので、i = 100 , 100 , 100 ... となってしまいます。
- 293 名前:デフォルトの名無しさん [2008/05/19(月) 22:29:40 ]
- いやそれは遅延のせいではないんじゃ…
- 294 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:31:29 ]
- C#のデリゲートはクロージャでない
- 295 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:34:25 ]
- 遅延させたいんでしょう、つかその必要がなければ、Lambdaなど使わずにその場で計算すれば済むわけだし。
- 296 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:39:05 ]
- Cocoaバインディング便利そうなんだけど、C#でUI作るとき同じようなもの作ったりしてる人おる?
- 297 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:40:44 ]
- >>292
List<Func<int>> list ; for(int i=0;i<100;i++) { var j=i; Func<int> tmp = () => j + 5 ; list.Add(tmp) ; } こうすればお望みの動作にならんかったっけ?見検証ヾ(゚д゚;) スッ、スマソ。
- 298 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:44:05 ]
- ListView.ItemSelectionChangedイベントで選択Itemが変化したのを検出し、
別の詳細表示フォームの表示を更新する、といったことをしています。 何も選択していないときは、詳細表示では何も表示したくないので全て消去しているのですが、 ItemSelectionChangedイベントは、選択が切り替わるときに「選択解除」と「選択」の2つのイベントを発生させます。 そのため「表示の解除⇒再表示」となってしまい、妙なチラツキが発生してしまっています。 1回目の解除用のItemSelectionChangedイベントでは、次に選択が入るかどうかが分からないので、 どうやってチラツキを抑えようか困っています。 この問題を改善する方法はないでしょうか?
- 299 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:04:48 ]
- >>292
こういうので良いんじゃない? var list = Enumerable.Range(0, 100).Select(i => (Func<int>)(() => i + 5)).ToList();
- 300 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:25:06 ]
- >>298
SelectedIndexChanged使えば?
- 301 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 02:04:34 ]
- >>297
やり方はそれでOK そのコード自体はNullReferenceExceptionになるけどなw てか、C#でラムダ式に(パラメータ以外の)変数を入れる場合は、 基本的にスコープを最小限して、参照型ならコピーを使うというのは for文の条件に不動小数点数を使わないのと同じくらい常識だと思う あと、ラムダ式をごちゃごちゃ弄る場合は式木使った方がいいと思う MSDNのどこかに載ってるExpressionVisitor使えばいろいろ出来る
- 302 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 02:15:36 ]
- intはいつから参照型になったんだ
- 303 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 03:25:22 ]
- >>300
それも試してはいるのですが結果は一緒でした。 マニュアルには複数選択のListViewの場合は削除と追加の時に呼ばれるとありますが、 これはMultiSelect=falseの設定でも同じ仕様で動いていました。 何か設定が足りないのでしょうか? (アイテム選択状態) ⇒別のアイテムを選択する ⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数0) ⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数1) SelectedItemsだけでなく、SelectedIndicesの内容も同様です。
- 304 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 03:43:33 ]
- 選択解除するタイミングはもっと限定できるんじゃないの
そのタイミングでだけ消せば
- 305 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 08:46:40 ]
- >>303
何も選択してないときの処理を別コントロールにフォーカスが移ったらって条件にすれば?
|

|