ふらっと C#,C♯,C#(初心者用) Part134
レス数が950を超えています。1000を超えると書き込みができなくなります。
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part133
http://mevius.5ch.net/test/read.cgi/tech/1510056685/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 証左、難しい言葉をしってるね。
>>881
エラー 2 '=>' は無効です。
ってなるが、、、 >>874
こういう実装を参考にして欲しくないな
コントロールのプロパティを自由に修正できなくなるじゃん var aa = ((Button)sender).Equals(button1) ? func1() :
((Button)sender).Equals(button2) ? func2() :
func2();
これどう? >>884
ButtonのName変更ってどんな実装に必要なんだよ・・・ >ButtonのName変更ってどんな実装に必要なんだよ・・・
最初はBUtton1だろ。出来上がって綺麗に整理するときにbtnSetParamとか分かりやすく書き換える。 >>885
それならEqualsじゃなくてsender==button1?でいいよ。キャストもいらない Button.Nameをつかうくらいなら、Tagに書き込んだ方がまし。 実装後にスペルミスに気付いた、他の画面との兼ね合いで名称を統一することになった、仮の名前をちゃんとした名前に置き換えた、とか色々あるだろ
リフレクションでデータ取得する方針のせいでガチガチに名前が決められている画面を作らされたときの面倒さったらなかったわ キャストしないとインテリセンスがでないから、キャストしたほうがいいよ。 こんなの考えたが、
public class CaseAction
{
public CaseAction(object @object, Action action)
{
Object = @object; Action = action;
}
public Action Action { get; private set; }
public object Object { get; private set; }
}
public static class Extensions
{
public static void Switch(this object o, params CaseAction[] caseActions)
{
caseActions.FirstOrDefault(x => x.Object == o)?.Action();
}
}
やっぱり使いづらそうだなw
ところで書いててちょっと思ったけど、==演算子の動作って隠蔽(new)と同じように変数の型に
依存するのか、それともオーバーライドと同じようにオブジェクトの型に依存ずるのか、どっちだっけ? ふと思ったが、ふつうにそれぞれのボタンのイベントに実装したらダメなの >>894
ほとんど共通でボタン毎にちょっとだけ処理が違うとかじゃね グループボックスにボタンを貼り付けて、それをコピーして貼り付けると、イベントが同じところになるだろ。
だからエディット都合だな。
イベントで分けるのが一番いい方法かもしれない。w 再表示するために tabPage1.Controls.Add(grp);で追加したgrpだけをクリアするにはどうしたらいいの?
tabPage1.Controls.Clear(); やるとボタンが消えてしまう。 Controlsプロパティの型はControl.ControlCollectionで
そのクラスのドキュメントを見ましょう。
Remove(Control)というのがあったのでそれで削除できそうです。 Removeを使うのはわかるんだが、要するになにがしたいのかというと
Linqを使ってControlsにAddしたGroupBoxだけを選択して、クリアしたいということ。
その書き方がわからない。ということ。 再表示とかクリアとか俺様な用語法されても何言ってるのか分からないよw tabPage1に貼り付けたコントロール群をLinqを使って選択的に消去したいということ。これでもわからん? 煽って悪かったけど
その書き方じゃ誰にもつたわらないよ
意味がわからないけどgrpを消したいならgrpをどこかに記録しておけばいい
終わり
はい次の方〜 >>904
よかったね
言葉遣いや表現力だけ見ると小学生かなって思うけど >903
Keyになる言葉の意味がわからないと解らないと思うよ。それが解る人にはわかる。 var toRemove = tabPage1.Controls.Cast<Control>().FirstOrDefault( .... );
if (toRemove != null)
tabPage1.Controls.Remove(toRemove);
これを1行にしたいってことだったのかな?
拡張メソッド使ってControl側に自分を包含するコンテナのControlCollectionを
引数に撮るメソッドを定義しないとできない気がする
何でもいいけど、冗長でもいいから分かるように書いて欲しいよね >>897
これでスタートして答えをもらおうとして失敗
次に >>899 要するにと言ってるけど何も要してないどころか条件を追加してる
そして これ >>901 への流れ
トンチンカン
最初のレスでなぜ伝わると思ったのかが分からない 無理矢理だなあ
Action<Control> removeMe = x => x?.Parent?.Controls.Remove(x);
removeMe(
tabPage1.Controls.Cast<Control>().FirstOrDefault( .... )
); private void button3_Click(object sender, EventArgs e)
{
var grps = tabPage1.Controls.Cast<Control>().Where(c => c is GroupBox );
foreach (var grpB in grps)
{
tabPage1.Controls.Remove(grpB);
}
}
これで一回で消えないのは何故だろう? grpsには全部のグループボックスが
入っている。しかしforeachでところどころ飛ばしてしまう。 ケツから消していくとうまくいくんだろきっと。
まえからでもこうやるとうまく行く。
private void button3_Click(object sender, EventArgs e)
{
var grps = tabPage1.Controls.Cast<Control>().Where(c => c is GroupBox );
List<GroupBox> gg = new List<GroupBox>();
foreach (var grp in grps)
{
gg.Add(grp);
}
foreach (var grpB in gg)
{
tabPage1.Controls.Remove(grpB);
}
} さて、原理は分ったが、これを1行で書くにはどうするのか? 逆にグループボックス以外を抽出してからパネルの中身全消去からの追加とかはどうかな(>_<) >>918
>>916のLinqにReverse()追加すれば >>919
なんで1行にこだわってるの?
どれだけ読みにくいソースにできるか研究でもしてんの? >920 それ、俺もちょっと考えた。
>921 それは最終手段にとっておいたのに。
Reverse()ってあるんか? それだ!! もう気が済んだかもしれんけど、無理に何でもインラインで書こうとして
可読性落とすなんて愚の骨頂で、普通にメソッドに外だし(別に拡張メソッドじゃなくてもいいけど)
した方がいいと思うけどね
public static class Extensions
{
public static void RemoveChildren(this Control control, Func<Control, bool> predicate)
{
var controls = control.Controls;
controls.Cast<Control>().Where(predicate).ToList().ForEach(x => controls.Remove(x));
}
} https://qiita.com/taigaaa2/items/7f05ad950a57033892ae
この方法で値を保存しているのですが
cドライブに保存されている様でプログラムを他のPCに移すなどすると値が保持されていません
どうすれば他のPCでも記憶した値を使える様になるでしょうか 真面目に答えるならサーバーやクラウドストレージのSettingsを読み書きするSettingsProviderを自作することだが
初心者にはひと月ふた月かかるだろうしはっきり言って時間の無駄 真面目な答の方が愚策という変な人、というかおそらくバカ >>926
ユーザー共通になっちゃうけど、スコープをユーザーからアプリケーションに変更すればexeと同じディレクトリに保存するよ 例えば.net 4.7で作られたプログラムを4.5しか入ってないPCで動かすとどうなりますか? >ユーザー共通になっちゃうけど、スコープをユーザーからアプリケーションに変更すればexeと同じディレクトリに保存するよ
アプリケーションじゃ動かんかったな。動くこともあるんだろうな。意味がわらかんし、マニュアル読んでも書いてないし
それにビルドで設定値が消えるから、、、最初から打ち直し。w
こんな意味の解らん機能はつかわない方がいい。JSON.NET使った方が遥かに楽。というのが俺の感想だ。 >>932
開発環境が4.7でも対象フレームワークを4.5に設定してビルドすれば、4.5が入ってるPCでも動く。
ただし、4.7でないと動かない機能は使えなくなる。 public static void RemoveChildren(this Control control, Func<Control, bool> predicate)
{
var controls = control.Controls;
controls.Cast<Control>().Where(predicate).ToList().ForEach(x => controls.Remove(x));
}
これは非常にスマートだという感じだが意味わからんなー。
predicate: 対象となるコントロールの場合はTrueを返す関数?
ToList() :predicateで判定したコントロールのListを作る。
ForEach:ToListからひとつづつコントロールをとりだしてxにセット、Removeする。
という意味だろうか?
Funcって初めて見た。いま調べてみるとよく使う標準デリゲートらしい。であれば
controls.Cast<Control>().Where(ラムダ式).ToList().ForEach(x => controls.Remove(x));
で一行でできる筈だな。
つまり
controls.Cast<Control>().Where(x=>x is GroupBox).ToList().ForEach(x => controls.Remove(x));
で実験してみると
tabPage1.Controls.Cast<Control>().Where(c => c is GroupBox).ToList().ForEach(x => tabPage1.Controls.Remove(x));
わーいうまく行ったぞ。 >>936
>.net4.7で作られた
をどう解釈するかだな Castを無くすために
tabPage1.Controls.OfType<GroupBox>().ToList().ForEach(x => tabPage1.Controls.Remove(x));
これでも動くのに、
tabPage1.Controls.OfType<GroupBox>().ForEach(x => tabPage1.Controls.Remove(x));
これは動かないのはなぜ? 実装してないものが使えるわけないだろ
魔法じゃないから そもそも列挙してる最中のものを削ると列挙に失敗する可能性が高い
最初から何番目の要素を取り出す
次はそれプラス1の要素としてるのに
1番目から消すと何番目というのがずれるだろ?
一番目を取り出すそれを消す
○×▼
↓
×▼
二番目を取り出すそれを消す
×▼
↓
×
三番目は取り出せない ToList()で控えを作る
できたList ○×▼ をみて対象を消していく
こちらは消し終わってList内容はそのまま >>941
いやまあそうなんだが、疑問というのは
var grps = tabPage1.Controls.OfType<GroupBox>();
varじゃわからないのだが、この型は何なの? Listじゃないよね。 可能性が高いと書いたのは列挙の方法がちがうかもしれないから ここは個別指導スレじゃないだろ
いい加減にわきまえろ
質問じゃなくて誰かに教えてもらいたいなら金を払って個人指導受けろ IEnumerableやyield returnの動作知らずにLINQ使うのって怖くないのかな var grps = tabPage1.Controls.OfType<GroupBox>();
var ggg = tabPage1.Controls.OfType<GroupBox>().ToList();
IDEでみるとgrpsは
{system.Linq.Enumerable.OfTypeIterater<GroupBox>}
gggは
count=10
と出る。 >IEnumerableやyield returnの動作知らずにLINQ使うのって怖くないのかな
何故怖いの?
IEnumerableとEnumerableの違いを端的に説明すると、どういうこと? キーワードがわかってるなら聞かないで自分で勉強したらいいのに
勉強したり努力してわからないならここで聞けばいい Enumerable.OfType <GroupBox > grps = tabPage1.Controls.OfType<GroupBox>();
これはできないよ。エラーになる。
List<GroupBox > ggg = tabPage1.Controls.OfType<GroupBox>().ToList();
これはOK >Enumerable.OfType<TResult> メソッド
あっと見落としてた、型じゃないのか。メッソドか。 >>936
ありがとうございます。
ターゲットフレームワークが4.7、動かそうとしているPCが4.5、プログラムの内容が4.5までで実現できるwinformsの場合でも起動すらできないですか? >例えば.net 4.7で作られたプログラムを4.5しか入ってないPCで動かすとどうなりますか?
4.7が動作しないPCはない(筈だ)から、4.7をダウンロードしたらいいだけだよ。
4.7をシステムに追加すれば問題なしに完璧に動作するよ。 >>960
クライアントがターゲットフレームワーク未満の場合は、起動時にエラーダイアログが出て終了する。
その内容だったら、ターゲットフレームワークを4.5に変更すれば良いのでは。
厳密には、4.5はサポート切れてるから、4.5.2に設定した方が良いと思うけど。 >>961,962
よく分かりました。ありがとうございます なんとなくpublicならプロパティ
privateならフィールドにするように
しているんだが
public なフィールドやprivateなプロパティって使うことある? >>951
> IEnumerableやyield returnの動作知らず
そいつらは実装者には必要だけどLINQ使う側には必要ないだろ そもそもこんな疑問でちゃう時点で機能としての出来が良くないんだから
使わない俺の大勝利 >>930
スコープがアプリケーションだと書き込みができない様で、書き込みのできる方法はありますでしょうか?
アプリケーションでいじった値をアプリケーションのあるフォルダなどに保存する方法が知りたいです
visualstudioで生成したDebugフォルダをコピーするだけで同じ設定のものがコピー出来る様になりたいです >>824
そんなレベルの疑問を自力で解決出来ないのに独自言語なんて作れるのか? >>970
>>930を真に受けちゃダメ
MSはバイナリをProgram Files以下のディレクトリにインストールして使うのが
標準的な使い方だと考えているので、アプリケーション設定も当然バイナリと同じフォルダに
保存する方法は用意されてない。(言うまでもないけど、Program Files以下のディレクトリに
ファイルを書き込むには特別な権限が必要)
バイナリをUSBメモリに入れて持ち歩くような使い方を想定しているようなアプリなら
当然バイナリと同じディレクトリに設定ファイルを保存するのもありだけど、
そういう場合は自分でそういうコードを書くしかない .netの前はアプリなどがシステムフォルダににDLLを入れていた
それでアンインストールなどを繰り返すとどれがどれに依存しているかわからなくなった
これをDLLヘルという
これを教訓にしてアプリではdll依存を極力避け
アプリの配布はビルドしたものを適当な場所にxcopyしただけで可能なように設計された ApplicationSettingsみたいなゴミを使うの止めればいいんじゃないの
何でこだわってるの?
ApplicationSettingにこだわらなければ10分で済む話だよね?
なんで半日も一日も掛けてるの?
不死身で時間が無限にあるの?
無職で時間が余ってるの?
休日ぼっちで暇なの?
ねえなんで? そもそもアプリケーション設定の解説なんていくらでもweb上に存在するのに
どうしてまずそれらを読まずに最初からできもしないことをできるはずだと思い込んでるのか、
そこが不思議。 アプリケーション設定には特にこだわりはありません
保存さえ出来れば構いません
出直してきます
申し訳ないです レス数が950を超えています。1000を超えると書き込みができなくなります。