X



ふらっと C#,C♯,C#(初心者用) Part134
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん (ワッチョイ 0f9a-KsIq)
垢版 |
2017/11/29(水) 19:23:58.05ID:GNLsbK4F0
「どんなにくだらない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
0896デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:11:27.96ID:LvTBogUR0
グループボックスにボタンを貼り付けて、それをコピーして貼り付けると、イベントが同じところになるだろ。
だからエディット都合だな。
イベントで分けるのが一番いい方法かもしれない。w
0897デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:13:35.51ID:LvTBogUR0
再表示するために tabPage1.Controls.Add(grp);で追加したgrpだけをクリアするにはどうしたらいいの?
tabPage1.Controls.Clear(); やるとボタンが消えてしまう。
0899デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:35:57.81ID:LvTBogUR0
Removeを使うのはわかるんだが、要するになにがしたいのかというと
Linqを使ってControlsにAddしたGroupBoxだけを選択して、クリアしたいということ。
その書き方がわからない。ということ。
0901デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:46:23.78ID:LvTBogUR0
tabPage1に貼り付けたコントロール群をLinqを使って選択的に消去したいということ。これでもわからん?
0904デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:54:28.34ID:LvTBogUR0
解決した。w
0906デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:57:07.86ID:LvTBogUR0
>903
Keyになる言葉の意味がわからないと解らないと思うよ。それが解る人にはわかる。
0909デフォルトの名無しさん (アウアウエー Sadf-Og17)
垢版 |
2018/02/03(土) 22:08:58.48ID:SzFJuxtQa
var toRemove = tabPage1.Controls.Cast<Control>().FirstOrDefault( .... );
if (toRemove != null)
  tabPage1.Controls.Remove(toRemove);

これを1行にしたいってことだったのかな?
拡張メソッド使ってControl側に自分を包含するコンテナのControlCollectionを
引数に撮るメソッドを定義しないとできない気がする

何でもいいけど、冗長でもいいから分かるように書いて欲しいよね
0910デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 22:13:41.72ID:LvTBogUR0
そんな書き方しかでけん?
0911デフォルトの名無しさん (ブーイモ MMcf-+DFt)
垢版 |
2018/02/03(土) 22:16:15.65ID:DOsYwXsiM
>>897
これでスタートして答えをもらおうとして失敗

次に >>899 要するにと言ってるけど何も要してないどころか条件を追加してる

そして これ >>901 への流れ

トンチンカン
最初のレスでなぜ伝わると思ったのかが分からない
0913愛恥人
垢版 |
2018/02/03(土) 22:34:23.85
最初のレスだけで理解できる俺は天才なのか
0916デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 22:54:26.09ID:LvTBogUR0
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でところどころ飛ばしてしまう。
0917デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:19:59.77ID:LvTBogUR0
あっ、謎がとけた。けっこう落とし穴だな。
0918デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:32:01.66ID:LvTBogUR0
ケツから消していくとうまくいくんだろきっと。
まえからでもこうやるとうまく行く。
    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);
             }
          }
0919デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:33:46.33ID:LvTBogUR0
さて、原理は分ったが、これを1行で書くにはどうするのか?
0920愛恥人
垢版 |
2018/02/03(土) 23:40:30.32
逆にグループボックス以外を抽出してからパネルの中身全消去からの追加とかはどうかな(>_<)
0924デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:49:22.30ID:LvTBogUR0
>920 それ、俺もちょっと考えた。
>921 それは最終手段にとっておいたのに。

Reverse()ってあるんか? それだ!!
0925デフォルトの名無しさん (アウアウエー Sadf-Og17)
垢版 |
2018/02/04(日) 00:42:43.56ID:OrIb/jt1a
もう気が済んだかもしれんけど、無理に何でもインラインで書こうとして
可読性落とすなんて愚の骨頂で、普通にメソッドに外だし(別に拡張メソッドじゃなくてもいいけど)
した方がいいと思うけどね

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));
  }
}
0926デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 05:54:59.74ID:vxeWu10H0
https://qiita.com/taigaaa2/items/7f05ad950a57033892ae
この方法で値を保存しているのですが
cドライブに保存されている様でプログラムを他のPCに移すなどすると値が保持されていません
どうすれば他のPCでも記憶した値を使える様になるでしょうか
0928デフォルトの名無しさん (ワッチョイ ff81-CU+w)
垢版 |
2018/02/04(日) 06:38:53.27ID:ldOBh/kr0
真面目に答えるならサーバーやクラウドストレージのSettingsを読み書きするSettingsProviderを自作することだが
初心者にはひと月ふた月かかるだろうしはっきり言って時間の無駄
0929デフォルトの名無しさん (ワッチョイ 7703-skLA)
垢版 |
2018/02/04(日) 08:14:14.99ID:ge7PbLBn0
真面目な答の方が愚策という変な人、というかおそらくバカ
0931愛恥人
垢版 |
2018/02/04(日) 10:35:42.99
>>762でユーザーにしたら動いた原因はなに?
0935デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 13:48:00.41ID:HudK1GnQ0
>ユーザー共通になっちゃうけど、スコープをユーザーからアプリケーションに変更すればexeと同じディレクトリに保存するよ

アプリケーションじゃ動かんかったな。動くこともあるんだろうな。意味がわらかんし、マニュアル読んでも書いてないし
それにビルドで設定値が消えるから、、、最初から打ち直し。w
こんな意味の解らん機能はつかわない方がいい。JSON.NET使った方が遥かに楽。というのが俺の感想だ。
0937デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:13:13.77ID:HudK1GnQ0
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));
わーいうまく行ったぞ。
0940デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:24:43.87ID:HudK1GnQ0
Castを無くすために
tabPage1.Controls.OfType<GroupBox>().ToList().ForEach(x => tabPage1.Controls.Remove(x));
これでも動くのに、

tabPage1.Controls.OfType<GroupBox>().ForEach(x => tabPage1.Controls.Remove(x)); 
これは動かないのはなぜ?
0942デフォルトの名無しさん (ブーイモ MMcf-+DFt)
垢版 |
2018/02/04(日) 14:30:00.97ID:2sg7PnbOM
そもそも列挙してる最中のものを削ると列挙に失敗する可能性が高い

最初から何番目の要素を取り出す
次はそれプラス1の要素としてるのに
1番目から消すと何番目というのがずれるだろ?

一番目を取り出すそれを消す
○×▼

×▼

二番目を取り出すそれを消す
×▼

×
三番目は取り出せない
0945デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:35:11.95ID:HudK1GnQ0
>>941
いやまあそうなんだが、疑問というのは
var grps = tabPage1.Controls.OfType<GroupBox>();

varじゃわからないのだが、この型は何なの? Listじゃないよね。
0953デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:50:13.12ID:HudK1GnQ0
var grps = tabPage1.Controls.OfType<GroupBox>();
var ggg = tabPage1.Controls.OfType<GroupBox>().ToList();

IDEでみるとgrpsは
{system.Linq.Enumerable.OfTypeIterater<GroupBox>}
gggは
count=10
と出る。
0955デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:53:56.98ID:HudK1GnQ0
>IEnumerableやyield returnの動作知らずにLINQ使うのって怖くないのかな

何故怖いの? 
IEnumerableとEnumerableの違いを端的に説明すると、どういうこと?
0957デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 14:59:19.86ID:HudK1GnQ0
Enumerable.OfType <GroupBox > grps = tabPage1.Controls.OfType<GroupBox>();
これはできないよ。エラーになる。

List<GroupBox > ggg = tabPage1.Controls.OfType<GroupBox>().ToList();
これはOK
0958デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 15:01:43.20ID:HudK1GnQ0
>Enumerable.OfType<TResult> メソッド

あっと見落としてた、型じゃないのか。メッソドか。
0961デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/04(日) 15:12:42.24ID:HudK1GnQ0
>例えば.net 4.7で作られたプログラムを4.5しか入ってないPCで動かすとどうなりますか?
4.7が動作しないPCはない(筈だ)から、4.7をダウンロードしたらいいだけだよ。
4.7をシステムに追加すれば問題なしに完璧に動作するよ。
0962デフォルトの名無しさん (ワッチョイ bf7f-qlLX)
垢版 |
2018/02/04(日) 15:17:08.79ID:CmrmETVT0
>>960
クライアントがターゲットフレームワーク未満の場合は、起動時にエラーダイアログが出て終了する。
その内容だったら、ターゲットフレームワークを4.5に変更すれば良いのでは。
厳密には、4.5はサポート切れてるから、4.5.2に設定した方が良いと思うけど。
0970デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 16:12:44.65ID:vxeWu10H0
>>930
スコープがアプリケーションだと書き込みができない様で、書き込みのできる方法はありますでしょうか?

アプリケーションでいじった値をアプリケーションのあるフォルダなどに保存する方法が知りたいです
visualstudioで生成したDebugフォルダをコピーするだけで同じ設定のものがコピー出来る様になりたいです
0973デフォルトの名無しさん (アウアウエー Sadf-Og17)
垢版 |
2018/02/04(日) 16:27:27.66ID:iJJ2KKb9a
>>970
>>930を真に受けちゃダメ

MSはバイナリをProgram Files以下のディレクトリにインストールして使うのが
標準的な使い方だと考えているので、アプリケーション設定も当然バイナリと同じフォルダに
保存する方法は用意されてない。(言うまでもないけど、Program Files以下のディレクトリに
ファイルを書き込むには特別な権限が必要)

バイナリをUSBメモリに入れて持ち歩くような使い方を想定しているようなアプリなら
当然バイナリと同じディレクトリに設定ファイルを保存するのもありだけど、
そういう場合は自分でそういうコードを書くしかない
0976デフォルトの名無しさん (アウアウウー Sa5b-+DFt)
垢版 |
2018/02/04(日) 17:11:47.67ID:lnA8IzXNa
.netの前はアプリなどがシステムフォルダににDLLを入れていた
それでアンインストールなどを繰り返すとどれがどれに依存しているかわからなくなった
これをDLLヘルという

これを教訓にしてアプリではdll依存を極力避け
アプリの配布はビルドしたものを適当な場所にxcopyしただけで可能なように設計された
0977デフォルトの名無しさん (ワッチョイ 17e6-CU+w)
垢版 |
2018/02/04(日) 18:11:17.96ID:IdDneOZ60
ApplicationSettingsみたいなゴミを使うの止めればいいんじゃないの
何でこだわってるの?
ApplicationSettingにこだわらなければ10分で済む話だよね?
なんで半日も一日も掛けてるの?
不死身で時間が無限にあるの?
無職で時間が余ってるの?
休日ぼっちで暇なの?
ねえなんで?
0978デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 18:13:05.97ID:vxeWu10H0
無職です申し訳ありません
0979デフォルトの名無しさん (アウアウエー Sadf-Og17)
垢版 |
2018/02/04(日) 18:13:56.88ID:b12ucEdla
そもそもアプリケーション設定の解説なんていくらでもweb上に存在するのに
どうしてまずそれらを読まずに最初からできもしないことをできるはずだと思い込んでるのか、
そこが不思議。
0980デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 18:17:04.23ID:vxeWu10H0
アプリケーション設定には特にこだわりはありません
保存さえ出来れば構いません
出直してきます
申し訳ないです
0983愛恥人
垢版 |
2018/02/04(日) 18:49:17.79
>>935
バインド出来ないじゃん(>_<)
0985デフォルトの名無しさん (ワッチョイ ff9a-HmOu)
垢版 |
2018/02/04(日) 18:50:55.56ID:YkvE7FF30
>>980
自分で貼ったリンクに保存場所書いてあるし
プロジェクト名がHogeのとき
C:\Users\{User名}\AppData\Local\Hoge\...\1.0.0.0\user.config
でProperties.Settings.Defaultって書いてあるんだからググったら
パスの取得の仕方は
https://dobon.net/vb/dotnet/programing/mysettings.html
に書いてある
このパスを必要な場所にコピーしたらいいだけ
俺の場合はこれの使い方を把握できなかったんで自分でパーサー書いた方が早かったなw
0986デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 19:03:57.70ID:vxeWu10H0
>>985
プログラムを別のマシンに移しても設定が保存されるようにしたいのです
でも保存場所を変えることは出来ないんですよね?
0987デフォルトの名無しさん (ワッチョイ 9f06-wbgk)
垢版 |
2018/02/04(日) 19:34:44.52ID:RXHjrV0B0
>>986
最近の流行りだと、設定を捨ててjson.netってやつで管理する
上記のそれはクラスオブジェクトをテキストにする(シリアライズと言う)ソフトなので
コレを普通のテキストファイルとして読み書きするだけです
0992デフォルトの名無しさん (アウアウエー Sadf-Og17)
垢版 |
2018/02/04(日) 20:18:09.97ID:rXp7+rpAa
>>986
一番簡単なのは、永続化(保存)したい情報だけをまとめたクラスを作って
シリアル化/逆シリアル化する方法。

シリアル化/逆シリアル化のための機能は.NETの標準ライブラリにも用意されてるので
わざわざサードパーティーのを使うことない

しかし、意地悪なのかマジなのか知らんけど、
なんか人を惑わすようなこと書く人ばっかりで質問者も大変だなw
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況