ふらっと C#,C♯,C#(初心者用) Part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1e7b-qjLW)
垢版 |
2019/10/07(月) 20:16:17.93ID:9eyAES450
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.5ch.net/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/10/07(月) 20:48:30.84ID:mLA0yK1I0
2019/10/07(月) 23:08:42.11ID:4esZ9KBu0
c# windowsフォームにファイルをドラッグ&ドロップしたらファイルのパスを取得みたいなコードはネットにありますし、そのままビルドしたら正常に動作しましたので良いのですが、
ファイルをドラッグした瞬間にパスを取得することは出来ますか?
2019/10/07(月) 23:10:15.53ID:WkkYpHG50
はい
2019/10/07(月) 23:12:19.73ID:QEMDFqtE0
うん
2019/10/07(月) 23:36:38.52ID:/mGKDAACa
>>3
普通にやると一番早く取得できるのはDragEnterやDragOverイベントかな
もしドラッグを始めた瞬間に取得したいのなら
全プロセスに対してOle32.dllのDoDragDrop呼び出しをフックして
プロセス間通信でパスを通知、とすれば出来るのかもしれないけど初心者がすることではなさそう
7デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 10:56:30.06ID:2mFIneqB0
質問失礼します
textboxに入力を終えて確定したことを知り自動的に
フォーカスをtextboxから別の決まったコントロール(buttonとか)に移動したいのですが
フォーカス移動のコードをどこにどう書いたらいいのか分かりません
8デフォルトの名無しさん (アウアウウー Sa21-5zAY)
垢版 |
2019/10/08(火) 12:49:06.43ID:8dDmccAua
>>7
ケースバイケースでは?
同じ機能のTextBoxが一つしかなく、他で使いまわす予定もないなら
Formに書けば十分。

複数使いたかったり汎用的で他で使いまわしたいなら

(a) TextBoxを継承してそこに書く
(b) UseControlにTextBoxとButtonをペアで配置してUseControlにフォーカス移動のコードを書く

このいずれか。
9デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:32:25.44ID:2mFIneqB0
>>8
ありがとうございます
なるほど、(a)かなあ
ところでtextboxの入力が確定したことをどうやって取得すればいいのかも分からないんです
それも教えてください、すみません!
10デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:36:59.57ID:2mFIneqB0
あ、それはTextプロパティが変化したかどうかを見ればいいのか?
でもそれじゃイベントハンドラがどうしたらいいのか分からない
Textの変更を始めたというイベントハンドラって取得できるんですかね?
11デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 13:52:29.59ID:2mFIneqB0
それも駄目か
やっぱり何らかの方法で変更が終了して
リターンを押して確定したことを取得しないといけないよね?
12デフォルトの名無しさん (ワッチョイ 3db0-FJ4P)
垢版 |
2019/10/08(火) 14:15:27.36ID:2mFIneqB0
わかった _TextChangedか!
ありがとうございました
2019/10/08(火) 17:51:14.93ID:Ibd7T+CL0
昔だったらkillforcusなんだけど
c#はなんだろう?
2019/10/08(火) 17:55:02.19ID:Ibd7T+CL0
あった多分これで検索すれば

c# textbox validated event
2019/10/09(水) 07:55:59.19ID:/K0h5hCH0
WPFアプリにてタスクバープレビューの右上の閉じるボタンから閉じた時のイベントを取得することは出来ないのでしょうか?
上記の方法で閉じると一見終了されたように見えてもプロセスは残ってしまうため、メインウィンドウの閉じるボタンを押したときに呼ばれる後処理メソッドを呼ばせたいのですが
2019/10/09(水) 08:46:37.34ID:zdauYmXS0
こっちの環境では普通にClosedイベント発生してるし特殊な終わり方はしてないようだが…
2019/10/09(水) 08:50:50.65ID:Y6sBp1G90
どういう方法で閉じようと、ClosingやClosedは経由するよな
18デフォルトの名無しさん (ワッチョイ 7dda-EMGa)
垢版 |
2019/10/09(水) 16:30:31.60ID:31sFMC5w0
C# + Oracleで自社内向け業務アプリ作ることになったんだけど、..net coreでなく、net frameworkのWinFormsでいいよね?
ユーザーはせいぜい1200人程度なんだけど、.net coreランタイム入れる手間を考えたくない。

WinFormsって結構大きなデメリットになったりする?
2019/10/09(水) 16:45:47.71ID:KnJFPOSX0
Formで複数のNumericUpDownを使ってます
値の変化はValueChangedイベントを使用してます

あるNumericUpDownを変化すると別のも連動します
値を変える場合一時的にイベントハンドラを無効にしてます

今は-=で無効にしてますが他にイベントハンドラを無効にする方法はありますか?
2019/10/09(水) 16:47:28.10ID:faTZyW/Hd
勘違いしてるみたいだけど.NET coreはインストール不要(自己完結型)でビルドできるよ
2019/10/09(水) 20:11:01.90ID:bRqP1Lm30
CoreってGUI作れるようになったん?
2019/10/09(水) 20:29:41.44ID:BQgggoCY0
core調べてみたら便利そうだな
調べるうちにだんだんUWPとWPFの違いが分からんようになった
WPFでUWPのコントロール使えるなら、UWPは制限きついだけか?
2019/10/09(水) 20:36:12.50ID:mYLA6NTyM
Win限定なら作れる
でも現実にはある程度のユーザー数のある業務アプリなら.NET Framework の方が遥かに配布は楽だよ
ClickOnceが使えるからね
.NET CoreはSCDができるのはいいけど、配布や更新に関して良くも悪くも単なるexeができる以上のサポートは何もない
ヘタにzipで配っちゃったら後で地獄を見ることになる
2019/10/09(水) 20:42:22.99ID:mYLA6NTyM
あと、今から業務アプリを新規に作るんならそもそもクライアントアプリではなくWebにすべきだ
Webなら配布の心配なんか最初から要らないし、.NET開発におけるメインストリームだから情報も豊富だし将来性もある
2019/10/09(水) 21:05:50.95ID:DtVKrlfY0
>>23
MSIX
2019/10/10(木) 01:06:13.89ID:8ioradGx0
>>19
フラグ使ってイベントハンドラの入り口でreturn
2019/10/10(木) 11:00:47.70ID:EXU1k5cj0
質問なんですが
DataGridViewでテーブルを表示させてるんですが、中のデータを変更してもDataGridViewが更新できません

class Person
{
  public int ID;
  public string Name;
}

class PersonList
{
  public List<Person> Data { get; }
  public PersonList()
  {
    new Person { ID = 1, Name = "tanaka" };
    new Person { ID = 2, Name = "kimura" };
  }
}

PersonList personList = new PersonList();
DataGridView1.DataSource = personList.Data;

今は無理やりデータソースを一度Nullにして消して再読み込みしていまうs
private void Button1_Click(object sender, EventArgs e)
{
  DataGridView1.DataSource = null;
  DataGridView1.DataSource = personList.Data;
}
これでは画面が一度消えてちらついたり、セル幅がリセットされたり、いまいちです
DataGridViewの再読み込み再描画でうまい方法あるでしょうか?
2019/10/10(木) 11:06:31.69ID:dY7xsk310
PersonにはINotifyPropertyChangedを実装して
各プロパティのsetでPropertyChangedイベントを発生させる

要素の追加削除に対応するならList<T>の代わりにBindingList<T>を使う
2019/10/10(木) 16:37:05.29ID:EXU1k5cj0
>>28
さんくすです
何やらうまくいきそうな感じですが、実際に書くのは難しそうです
少し調べてみます
2019/10/10(木) 19:37:58.48ID:+cMNiUZhM
ASP.NET(VS2013) でWebアプリを作っています。
データベースから取得したデータをGridViewにBindしています。
特定のカラムを編集したくて OnDataBound イベントにて以下のようにしてTextBoxを追加しました。

foreach (GridViewRow rw in GridView1.Rows)
{
TextBox txt = new TextBox();
txt.Text = rw.Cells[2].Text;
rw.Cells[2].Controls.Add(txt);
}

この後、TextBoxの値を取得したいのですが、

foreach (GridViewRow rw in GridView1.Rows)
{
TextBox txt = (TextBox)rw.Cells[2].Controls[0];
xx = txt.Text;
}

ではうまくいきません。Controlsがないようです。
どうすればTextBoxの値を取得できるでしょうか。
31デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/10(木) 19:39:53.55ID:i+8+28k+F
・extBox txt = (TextBox)(rw.Cells[2]).Controls[0];
2019/10/10(木) 20:08:53.90ID:aBdkLcoOM
>>31
>>30です。
ダメです。〜.Controls.Countが0なので、インデックスの範囲外になってしまいます。
2019/10/10(木) 21:29:45.48ID:kk1CdJ+b0
ProcessクラスにはDispose()があるようですが、
var processes = Process.GetProcesses();
とした時点で上記のProcess[]内のProcessたちを全てDispose()しないとメモリリークなどしてしまうのでしょうか?
それとも実際にハンドルなどを参照したものだけDispose()すれば良いのでしょうか?
2019/10/10(木) 21:39:45.74ID:afa4sCIxa
>>33
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,1554
ReferenceSourceを見ると
GetProcessesByName()が内部でGetProcesses()を使っていて、それの戻り値配列に使わない場合はDispose()しているから
GetProcesses()を直接呼び出している場合でも戻り値配列の各ProcessをDispose()したほうが良さそう

GC管理下にあるからDisposeを呼び忘れていても、ファイナライザが呼び出されて少なくともメモリーは回収されるとは思う
2019/10/10(木) 21:49:47.76ID:kk1CdJ+b0
>>34
ありがとうございます
一応全く使わないProcessもDisposeしておくことにします
2019/10/10(木) 21:51:48.13ID:IMCrZqO+0
クラスA内にインスタンスメソッドBがあったとして、長くなってしまったから一部をメソッドCとして外に出すとします
このCはBから呼び出される以外どこからも参照されません。本当にちょっと分離するためだけに分けているのです
このときCの修飾子はどうするのがいいのでしょうか。publicは論外として、ただ単にprivateでいいんですかね
staticとかつけた方がいいですか?クラス内で変な使われ方するのを防いだ方がいいかなとか思ったのですが
2019/10/10(木) 22:11:44.95ID:IquandTc0
そのソースを自分しか触らないのであればprivateでいいと思う
自分で作っているんだから変な使われ方をされることもないだろ?

もし他の開発者が触る可能性があるんならローカル関数を使えばOK
38デフォルトの名無しさん (ワッチョイ 9fad-vnAR)
垢版 |
2019/10/10(木) 22:18:06.84ID:BXM3vcse0
privateにしてコメントに注意書きしておけばいいと思うが
メソッド名の頭にアンダースコアつけるとか
DoSomethingFromBOnly()みたいな名前にしておくとか
2019/10/10(木) 22:21:13.96ID:hT7PmE+00
全部public
クラスAを継承したクラスA2で
メソッドBをちょっと変えた
メソッドB2を作りたいときに
メソッドCを呼べない欠陥クラス
40デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/10(木) 22:26:58.12ID:PsSxAeUca
>>36
普通にprivateにすればOK。
誤用されるリスクは分割したメソッドに固有の問題じゃない。
それは命名と抽象化が不適切ならどのメソッドにも起こりうる。
だから分割したら誤用されるんじゃないか、って発想はかなり変だ。

staticはインスタンスメンバーを使わないなら付けるべきだが、付けたからって
誤用されるリスクが減るわけじゃない。

ローカル関数は、

(1) 分割したメソッドを何度も呼び出す。
(2) その時に必ず同じ変数を引数として渡す(それが冗長に感じる)

こういうケースじゃなきゃ積極的に使う理由はない気がする。
2019/10/10(木) 23:44:04.64ID:a+kHg1ZD0
メソッドBからしか正常に動作しないメソッドCという構図ならそもそも設計が怪しい
メソッドB以外から使われることがないだろうくらいの感じなら
万一使われても別に困らないしprivateで問題ない
2019/10/10(木) 23:49:12.95ID:+/bzkuJ6a
ローカル関数を使いたがる奴は総じてレベルが低いね
43デフォルトの名無しさん (ワッチョイ 1f2d-epSy)
垢版 |
2019/10/10(木) 23:51:17.44ID:mQn3Hgbj0
グローバルおじさんが来たな
2019/10/10(木) 23:56:49.95ID:hT7PmE+00
>>41
は?
>>39のケースで普通に困るだろ
ボケてんかよ
45デフォルトの名無しさん (ワッチョイ 1f2d-epSy)
垢版 |
2019/10/10(木) 23:58:46.54ID:mQn3Hgbj0
>>44
でもまあ拡張性に優れてないのは元からっぽいから、分けて書くことに始まった問題じゃないじゃん?
2019/10/11(金) 00:18:02.53ID:f+9us5CU0
全部publicおじさんなんかどう見ても荒らしなんだからNGに放り込んどけ
2019/10/11(金) 00:18:46.89ID:vfhfRP3v0
>>39のケースを解決しようととりあえずprotectedにすればいいと思うだろ?

ところがメソッドB2の処理の途中に
クラスXの処理を絡ませなければならないことになった
しかし、クラスA2はクラスXを呼び出すと循環参照になってしまうためそれができない

なのでクラスEにメソッドB3を作成することになった

ときにメソッドCはprivateでは呼び出すことができない

ここまで解決しようとするとメソッドCはpublicにしておくしかない

そしてこれはよくあることだ
2019/10/11(金) 00:26:16.32ID:i87v0bN60
全部virtualだろ普通
49デフォルトの名無しさん (ワッチョイ 17da-IE9o)
垢版 |
2019/10/11(金) 06:13:02.24ID:YbeJbbo90
皆さんは、Windowsノートパソコンで開発されてるのでしょうか?
それともsurface?MacBook Pro?iPad Pro?

プログラミング用にMacBookをすすめるサイトをよく見ますがC#ではやはりWindows機?
個人的にはThinkPadかなと思ってますが
皆さんはどんなもんですか
2019/10/11(金) 06:47:08.88ID:MFeQoEVg0
デスクトップだけど
2019/10/11(金) 07:23:14.81ID:e5VBdiYBM
>>47
> そしてこれはよくあることだ
ねーよ
よくあるとしたらお前の設計力が無さすぎ
そもそも
> メソッドBをちょっと変えた
> メソッドB2を作りたいときに
の時にBからB2をコピペして改変する時点でアホ丸出し
2019/10/11(金) 07:54:18.02ID:vfhfRP3v0
>>51
え?じゃあどうするん?
話の主旨とそれるけど
virtualにしてもやっぱりメソッドCは呼べんやろ
それで?
どうしたいって?
2019/10/11(金) 08:18:01.09ID:e5VBdiYBM
>>52
アホすぎる…
クラスAをベースクラスにして変更部分をvirtualで差し替えてA1(これが今までのA)とA2を作る
変更部分にCを呼ぶコードがあるならCはクラスA1にだけあればいい
変更部分にCを呼ぶコードがないならCはクラスAに置いとけばいい
2019/10/11(金) 08:20:42.62ID:vfhfRP3v0
>>53
え?なんかよくわからない
>>39みたいにかけない?
継承先でメソッドCを呼ぶ必要があるときどうだって?
55デフォルトの名無しさん (アウアウウー Sa5b-IE9o)
垢版 |
2019/10/11(金) 08:24:45.95ID:blacN5wca
>>50
うぅ・・
2019/10/11(金) 08:43:13.37ID:Q3FyvZZg0
今開発中のもので初めて例外を補足しない強制終了が起こったのですが、原因としては唯一のunsafeであるstackallocだと思われます
var stack = count <= 20 ? stackalloc ulong[count] : new ulong[count];
動的なサイズですが上記のように一応サイズ制限はしていたのですが、ulong[20](160byte)程度でもスタックオーバーフローは起こり得るんでしょうか?
2019/10/11(金) 08:56:19.70ID:e5VBdiYBM
>>54
ちょっとは勉強しろよ...
両方の継承先で呼ぶ必要があるならベースに置けばいい
どっちか片方だけでいいなら必要とする継承先に置けばいいだけ
まともにコード書いたことないのか?
2019/10/11(金) 08:56:32.12ID:01d3zJlsM
>>30です。
何かヒント頂けないでしょうか。
2019/10/11(金) 09:01:19.07ID:w9BsPIYw0
>>56
残りスタックが少なければ起こりうると思うけど例外吐いてないなら別の要因じゃないかと思う
2019/10/11(金) 09:06:03.62ID:Nij9ynML0
>>56
イベントログを見てStackOverflowExceptionであることは確認した?
2019/10/11(金) 09:46:04.72ID:ZRjHQIQqM
>>56
それコンパイル通るのか?
?の第2オペランドと第3オペランドの型があってないように見えるが
2019/10/11(金) 10:32:44.13ID:4B4iU4j0a
>>61
https://ufcpp.net/study/csharp/resource/span/#safe-stackalloc
C#7.2から出来るようになった
stackallocもnewも暗黙的にSpan<T>へ変換される
2019/10/11(金) 11:58:36.03ID:y81cSpJS0
>>57
え?
意味不明
2019/10/11(金) 12:32:45.04ID:e5VBdiYBM
>>63
勉強不足すぎw
てか多態の基本だぞ
2019/10/11(金) 12:59:48.32ID:47sbrrFf0
>>64
え?継承元のprivateって呼べないよね?
2019/10/11(金) 13:49:55.26ID:R9rR1P0/M
古いコードを見ているのですが
if (false) {// なにか処理}
がたっくさんあるんです。
到達できないコードが検出されましたって大量に出て当たり前だよ!って

仮に何か意味があるとしたらどんな理由が考えられるでしょうか
全部消せと思うのですが何かわたしの知らないテクニックだったらまずいですし
2019/10/11(金) 13:49:59.05ID:V+fiNkQ50
C#なら出来るでしょう
2019/10/11(金) 13:51:26.84ID:IXdSVzcC0
テスト用なんじゃね
必要なくなったからfalseにしているだけでは
2019/10/11(金) 14:01:31.76ID:w9BsPIYw0
テストとかデバッグ用の処理じゃないかな
#if falseにすれば警告は除去できると思う
2019/10/11(金) 14:50:33.17ID:Y/pxrYXGM
>>65
継承元のprivateを呼ぶ話なんてしてないだろ
>>53をちゃんと読めよ
2019/10/11(金) 16:11:04.13ID:RwnMXNoM0
>>70
じゃあ、お前、一連の流れを理解しないでレス付けたな
もうようないわ
2019/10/11(金) 16:55:31.32ID:BNgoH63S0
Properties.Settings.Defaultについて教えてください
DataGridViewのセル幅の設定を保存したいのですが、いい方法はあるでしょうか?

セルが20個ほど並んでるのですが、Settings.SettingsにはInt[]の配列が選べないし
プロパティバインディングも項目がありません、たくさんのIntを保存するにはどうしたらよいでしょか?
73デフォルトの名無しさん (アウアウウー Sa5b-YqqQ)
垢版 |
2019/10/11(金) 16:55:34.98ID:Qe/y/ERba
>>66
謎だねw
#ifディレクティブやコメントアウトを選択しなかった理由は
IDEでシンボル検索した時に引っかかるようにしたかったから、とかも考えられるけど、
まあ多分単純に書いた人がアホなだけだろうw

仮にそうう理由があるとしてもfalseなんてリテラルをそのまま書くのは意味が分からん
2019/10/11(金) 17:05:59.65ID:V+fiNkQ50
Java屋に呪いをかけられた。
2019/10/11(金) 17:10:57.43ID:Nij9ynML0
>>72
カンマ区切りの文字列にでもするとか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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