X



ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ドコグロ MM07-2FKJ)
垢版 |
2018/04/06(金) 17:40:19.48ID:oKXVP34zM
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■関連スレ
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/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part136
http://mevius.5ch.net/test/read.cgi/tech/1520057345/

■コードを貼る場合は↓を使いましょう。
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
0316デフォルトの名無しさん (ワッチョイ 1fe3-jSAq)
垢版 |
2018/05/03(木) 22:02:53.69ID:nzAwdXFB0
大して変わんねーよ
そんなに処理分けたきゃ
別exeにしてキックしろよ
後はできるならOSがうまくやるし
OSがうまくできなかったらそりゃできないんだろうよw
0319デフォルトの名無しさん (ワッチョイ 2f03-eBll)
垢版 |
2018/05/03(木) 23:38:41.22ID:aADwc6210
おバカwebを鵜呑みにしない有望な>>312なんやからもう少し優しくレスしてやれよw
0321デフォルトの名無しさん (アウアウエー Sa82-oFLj)
垢版 |
2018/05/04(金) 00:37:22.14ID:pvqh60Bra
>>318
自分の日本語に疑問を持たない君の方が怖いよ

「これ(A)」でいいのか、Bじゃないのかって質問に「それ」で正しいと答えたら
質問した方は普通は正しいのは「これ」の方だと理解する
0322デフォルトの名無しさん (ワッチョイ 53b3-An5J)
垢版 |
2018/05/04(金) 02:08:40.41ID:DbHU5BaK0
C♯でJavaScriptで生成されてるチャットサイトからコメントビューアを作りたいのですが、JavaScriptが生成したHTMLを取得するのに適したライブラリってどれでしょうか?
Formアプリで作る予定ですが
webBrowserコントロールが一番手軽でしょうか?
0326デフォルトの名無しさん (ワッチョイ 0aa6-N4mI)
垢版 |
2018/05/04(金) 16:58:55.69ID:wDfbuSiA0
おバカwebと言えば↓みたいに日本語と英語で全く逆のことが書いてあったりする
基本的にwebに書いてあることは疑ってかかったほうが良さそうね

日本語
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage
> 比較のために文字列を正規化する場合は、String.ToUpperInvariant メソッドではなく String.ToLowerInvariant メソッドを使用します。

英語
https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage
> Use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you normalize strings for comparison.
(グーグル翻訳) 比較のために文字列を正規化するときは、String.ToLowerInvariantメソッドの代わりにString.ToUpperInvariantメソッドを使用します。
0328デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/04(金) 19:43:22.77ID:RYlEGIXb0
グラフィックの扱いについて教えてください

panelに複数の画像イメージを貼り付けたいと思います
(トランプのカードを任意の枚数置くような感じです)

WidthとHeightをpanelのサイズに合わせて、Bitmapオブジェクトを
作ってそこに必要な画像を貼り付けて、最後にPaintイベントでその
ビットマップを Graphics.DrawImage で表示すれば良さそうだ、という
認識です

問題はBitmapオブジェクトに画像を貼り付けることで、メソッドを
調べても、Bitmapオブジェクトの任意の場所に任意のイメージを
貼り付けるものはなさそうです
そもそも用意した画像は Image.FromFile で準備しているのですが、
Imageオブジェクトを貼り付けられるのは Graphics.DrawImage
メソッドになるので、そもそも Bitmap オブジェクトを用意すると
いう発想が間違っているような気もします

多分いろいろ間違って認識しているので、どこから考え直せばよいか
教えていただけると嬉しいです
0329デフォルトの名無しさん (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/04(金) 19:54:32.04ID:EvkA5vHv0
>>328
ベースの画像のいくつかの任意の位置に画像を貼り付ける描画ならそれで間違っていないけど
https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.drawimage(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/558kfzex(v=vs.110).aspx
どこを勘違いして悩んでいるのかいまいちわからない
とりあえずBitmap オブジェクトはImageオブジェクトの一種
他にMetaFileとかあるから
そしてGraphics.DrawImageメソッドを使って貼り付けてもベースのBitmap オブジェクトはBitmap オブジェクトのまま
0330デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/04(金) 20:25:52.55ID:RYlEGIXb0
>>329
私の認識は、最終的に描画したいビットマップを用意して、それを Paint イベントで
描画するというものです
Panel1_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawImage(canvas, 0, 0);
}

で、上記の例で Bitmap canvas; とでもして用意したビットマップに、任意の画像を
貼り付ける方法を知りたいのです
例えば256x256ピクセルのサイズで用意したビットマップに、32x32ピクセルの
画像を3個位貼り付けた canvas を用意したいというものです

「そうではなくて、最終的に描画したいものはGraphicsオブジェクトで用意して、
Paintイベントで毎回描画するのだ」というのが正なのかもしれません
Panel1_Paint(省略) {
e.Graphics.DrawImage(image_1, image_1_x, image_1_y);
e.Graphics.DrawImage(image_2, image_2_x, image_2_y);
...
}
といった感じで

でもなんだか、毎回Paintイベントハンドラに描画処理を全部書くのは変な感じがして、
描画したい画像を用意するのと、実際に描画するのは別の処理ではないかと思っている
次第です
0331デフォルトの名無しさん (ワッチョイ bbb5-MrO9)
垢版 |
2018/05/04(金) 20:30:54.11ID:Ad2tmUBO0
描画したい画像を用意するのと、それを描画するのは当然別の処理だ。
でもアニメーションさせたいとか画像の変更を即座に描画に反映させたいとかなら、用意した足で再描画させるしかないだろ?
0334デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/04(金) 20:49:55.24ID:RYlEGIXb0
>>331
アニメーションさせたいとか、そういう意図はないです
単に、描画したい画像を用意するのに、Bitmapオブジェクトにさらに画像を
貼り付ける方法がわからなくて悩んでいます

>>332
イベントでやってるのは、単に参考にしたサイトで「Paintイベントハンドラで
処理する」と書いてあったので、それを鵜呑みにしただけです

https://dobon.net/vb/dotnet/graphics/drawimage.html
これを見て気づきましたが、そもそもパネルに直接描こうとするのが間違いで、
パネルにPictureBoxを貼り付けた上でそこに置けば良いのかな?
0335デフォルトの名無しさん (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/04(金) 20:54:32.05ID:EvkA5vHv0
>>334
どっちでも同じだと思う
Graphics g = Graphics.FromImage(panel1.BackGroundImage);
でやれば直接パネルに書き込めるし
ただ大きい画像を表示して画像の表示位置をスクロールさせたいのならパネルの上にPictureBoxが基本
とりあえず書いて動かしてみたら
0337デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/04(金) 21:11:39.38ID:RYlEGIXb0
>>336
実現したいことは、「任意の画像を任意の場所に配置したイメージを、panelに描画したい」です
これは明確で、それを実装するための方法でどう悩んでいるかが正しく伝わらないと、答える方も
こちらのレベルがわからなくて困るかと思ってました

実現したいことがちゃんと伝わっていませんでしたか
それ以前の問題でしたね。。。
0340デフォルトの名無しさん (ワッチョイ 1ee8-XJxX)
垢版 |
2018/05/05(土) 01:53:47.84ID:US1Viqbq0
bmp1が配置先のイメージ、
bmp2がbmp1に配置したいイメージだとしたら以下になる

Graphics g = Graphics.FromImage(bmp1);
g.DrawImage(bmp2, x, y); // bmp1の(x, y)にbmp2を書き込む
g.Dispose();
pictureBox1.Image = bmp1;

これだけでパネルにbmp1が表示される
0342デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/05(土) 05:38:36.94ID:LRJiKh0v0
>>340
ありがとうございます
思っていることが問題なく実現できました

できるようになってみると、一体何を悩んでいたのか、自分でもわからなくなってしまいました
多分、DrawImage で書き込む先がVRAMだと思い込んでいたのでしょう
0343デフォルトの名無しさん (ワッチョイ bf9e-DJjQ)
垢版 |
2018/05/06(日) 01:21:02.23ID:dl2mQyCb0
private void Form1_ResizeBegin(object sender, EventArgs e)
{
  leftEdge = this.Left;
  rightEdge = this.Right;
  topEdge = this.Top;
  bottomEdge = this.Bottom;
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
 if ((rightEdge < this.Right) && (topEdge > this.Top))
 {
   // 処理に入らない
 }
}

このコードでフォームを右上にドラッグして拡大した場合に処理に入らないのですがどこがおかしいでしょうか
0346デフォルトの名無しさん (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/06(日) 01:40:54.74ID:LGFxrhOP0
>>343
イベント有効になっている?
Form1_ResizeEndのメソッドに処理が入っているかそこから確認
  int leftEdge, rightEdge,topEdge ,bottomEdge;
public Form1()
{
InitializeComponent();
this.ResizeBegin += Form1_ResizeBegin;
this.ResizeEnd += Form1_ResizeEnd;
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
this.Text = "start";
leftEdge = this.Left;
rightEdge = this.Right;
topEdge = this.Top;
bottomEdge = this.Bottom;
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
this.Text = String.Format("{0}:{1}", (rightEdge < this.Right), (topEdge > this.Top));
if ((rightEdge < this.Right) && (topEdge > this.Top))
{
this.Text = "OK";
}
}
これで動いた
0347デフォルトの名無しさん (ワッチョイ 7bd6-pRpi)
垢版 |
2018/05/06(日) 01:45:28.35ID:mBsERy4z0
private void DataGridViewFilter()
{
BindingSource objBind;
DataTable objData;
string strFilter;
objData = (DataTable)DataGridView1.DataSource;
if (IsNothing(objData) == false)
{
objBind = new BindingSource();
objBind.DataSource = objData;
strFilter = "Color like '%" + txt_Condition.Text + "%'";
objBind.Filter = strFilter;
}
}
0348デフォルトの名無しさん (ワッチョイ bf9e-DJjQ)
垢版 |
2018/05/06(日) 02:05:39.13ID:dl2mQyCb0
>>346
ご回答ありがとうございます
イベントは有効です
左や上や左上への拡大縮小ドラッグは正常なのですが左下や右上がおかしいです
提供していただいたコードを試したのですが、何故かは分からないのですが rightEdge < this.Right がfalseになっています
もう少し調べてみます
0350デフォルトの名無しさん (ワッチョイ 8a98-XJxX)
垢版 |
2018/05/06(日) 05:58:39.10ID:CBGkbUql0
Listを値渡しすべき所が参照渡しになってたせいで
くっそハマったんだけど
こういうのって、C#の解説本1冊読めば
注意しろって書いてあるもんなの?

参照渡し云々って単語はかろうじて知ってて
↓のサイトをたまたま見つけて、偶然解決出来たけど
https://webbibouroku.com/Blog/Article/list-copy

エラーや例外にならないバグが怖すぎる・・・
0354デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 09:09:18.32ID:9GXSG5IC0
イメージの配置はできるようになりましたが、いろいろ触っていると、チラツキが
気になるようになってきました
テストしてみたところ、下記のレベルでもチラツキが発生します

private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = Graphics.FromImage(canvas);
g.FillEllipse(bg_brush, x, y, radius, radius);
x += 5;
g.FillEllipse(fg_brush, x, y, radius, radius);
count++;
g.Dispose();
pictureBox1.Image = canvas;
if (count == 10)
{
count = 0;
timer1.Stop();
}
}
timer1.Intervalは100msにしてあります
チラつきを押さえるには、フォームの DoubleBufferd を true にすると良いと見ましたが、
true にしても false にしても変わりないようです
そもそも PictureBox は内部処理でダブルバッファリングを行っているとも見ました
まだなにかできることはあるのでしょうか
0355デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 09:36:21.79ID:9GXSG5IC0
書いてませんでしたが、bg_brushは背景色の、fg_brushは前景色のブラシです

Brush bg_brush = new SolidBrush(SystemColors.Control);
Brush fg_brush = new SolidBrush(Color.Black);

で定義しています
0358デフォルトの名無しさん (ワッチョイ 1ee8-XJxX)
垢版 |
2018/05/06(日) 10:36:38.03ID:RTzVBomo0
DoubleBufferdとか触らずともこっちではちらつかないけどなあ
ちらつくってのはどういうふうに見えることを言ってるの?
panelやpictureBoxのサイズやradiusの値もさらしてみては?
0364デフォルトの名無しさん (アウアウウー Sacf-pRpi)
垢版 |
2018/05/06(日) 15:35:36.42ID:MOQB+J+Ha
解決のヒントにはならないだろうけど

ちらつきって何かということについて
すでに表示されてるものが一瞬透明に見えるから表示がおかしく見えること

たとえば半径100の円が横に5ドット動くとする
普通に考えたらほとんどの円に背景は隠れたままだけど何も考えないで適当にやると
背景が一瞬見えてしまう

一度円を消してなにもない状態を表示して
次に円を書いてるから問題がある

何もない状態を表示しなければいい
0365デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 18:19:28.93ID:9GXSG5IC0
>>363
環境の問題ですか・・・
一応ディスプレイのリフレッシュレートは60Hz、タイマー設定が50msだと20Hzあれば
十分ですので、あまり関係ない気がするのですが
でも私の環境でしか出ないのであれば、環境依存かもしれません

>>364
これを避けるためにダブルバッファリングをするわけですし、書き換えた後のビットマップを
PictureBoxに貼り付けるようにして、描画途中では貼っていません
0369デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 18:55:10.27ID:9GXSG5IC0
>>367
カクカクした動きとチラつきを同一視しているわけではありません
>>364
が書いたように、今回の例だと黒い円が一瞬消えているような感じがします
移動量の x += 10; をもっと少なくすれば目立たなくなりますが、それでも
なんとなく嫌な感じがします
でも言葉で説明するのは難しいですね

低フレームレートの認識を誤解していたようですが、インターバルを100msとか
50msとかだとディスプレイのリフレッシュレート(あるいは人間の認識力)に比べて
低すぎるので、かえって目立ってしまうということでしょうか?
確かに、インターバルを思い切って5msとかにしてみると、チラつきは軽減されてきた
気がします
0370デフォルトの名無しさん (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/06(日) 19:33:59.43ID:7/UIZFPx0
ちょっと改変して逆にチラツキをわかるようにしてみた
https://ideone.com/3X8oJh
WinFormプロジェクトを新規で作って元のソースを全部消したうえで、このソースを既存の項目として追加
上がPictureBoxで下がPanel
>>369
PictureBoxのダブルバッファがデフォルトで有効なのは知っているのを確認したので
その上でPanelはデフォルトでダブルバッファが有効だというのを念頭に入れてコードを実行してほしい
同じオブジェクトの動きだが、うちで確認する限りは下はあきらかにチラツキがあって上は目立たない
>>364
>何もない状態を表示しなければいい
というわけで先に描画して動いた部分だけを消すという動作を実現してみたつもり
だったんだけど、移動量を大きくするとカクツキがどうしても目立ってしまってうまくいかない。ギブアップw
>>369
もっとGDI+の動作を把握するとかゲームなどでの実装方法を探すかした方がいいと思う
残念ながら俺の知識ではここまで
0371>>370 (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/06(日) 19:37:36.72ID:7/UIZFPx0
ごめん
>Panelはデフォルトでダブルバッファが有効だというのを念頭に入れて
Panelはデフォルトでダブルバッファが無効だというのを念頭に入れて
の間違い
0372デフォルトの名無しさん (アウアウエー Sa82-oFLj)
垢版 |
2018/05/06(日) 20:17:55.74ID:LW3/RgRJa
うーんw

>>360のコード自体がダブルバッファリングの実装なので、
少なくともGDI+を使う限り、これで本当にちらつくなら何をやってもちらつき回避は不可能。

何度も言うけど、少なくとも俺の環境では低フレームレート特有の不自然さはあっても
フリッカーは確認できない

しつこいようだけど、俺は質問者がちらつき(フリッカー)がどういう現象か
理解してないだけのように思う
0373デフォルトの名無しさん (ワッチョイ 1fe3-jSAq)
垢版 |
2018/05/06(日) 20:20:58.90ID:j24ysXtO0
まあ、unity使ってもDirectX使ってもスクロールとかなめらかにならないしね
グラボも汚いってのも考慮に入れる
市販のゲームでもスクロールしてるときはカクカクグシャグシャはデフォ
0374デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 20:21:41.45ID:9GXSG5IC0
>>370
ありがとうございます
私が確認しても、確かに上下で明らかにチラつきが違い、下ははっきりとわかります
上はほとんどわからないレベルですね

PictureBoxもPanelも、どちらも出来上がったビットマップを貼り付けているのですから
同じ表示になりそうな気がしますが違いますね
これをちゃんと理解できれば解決できそうです
0376デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 20:39:37.09ID:9GXSG5IC0
>>372
私が「チラツキ」と表現しているのは、>>370が上げてくれたプログラムの
下側、panelで発生している現象です

私の理解では、>>370でなぜ表示に違いが生じるのかがわかりません
どちらも、加工後のcanvasを貼り付けているはずなのに

>>370でやっていることは、ダブルバッファリングではないのでしょうか?

>>370のプログラムを実行してみて、違いはPictureBoxをウィンドウに直接
貼り付けているか、panelを置いてその上に貼り付けているか、です
私のテストプログラムでは、panelを置いてその上にpictureBox1を置いてます
これが影響するのでしょうか
0377デフォルトの名無しさん (ワッチョイ 1e9a-XJxX)
垢版 |
2018/05/06(日) 20:49:20.18ID:7/UIZFPx0
https://ideone.com/PNPIlj
蛇足だろうけどnew BitmapじゃなくPictureBox.Imageを直接描き変えるもの
>>376
370で何をしたかったかというと「ダブルバッファリングではこれ以上改善できない」事の証明
>panelを置いてその上にpictureBox1を置いてます
それは多分関係ない。panelに背景を設定すると話が変わると思うけど
実際に改善するには移動量を少なくして滑らかに見せるくらいしかおもいつかない
消える側の方でなく進行方向側でカクついているんだよなあ・・・
0378デフォルトの名無しさん (ワッチョイ 03c3-XJxX)
垢版 |
2018/05/06(日) 21:02:31.57ID:9GXSG5IC0
>>377
試してみました
>>370と変わらない感じですね
これまで質問してきた趣旨とは変わってしまいますが、

Graphics g = Graphics.FromImage(pictureBox1.Image);

これでビットマップを書き換えた後に pictureBox1.Image を書き換えていないと
いうことは、いちいち canvas ビットマップを用意して細工しなくてもよかったと
いうことでしょうか

で、本質ですが、ご提供いただいたテストプログラムでは明らかにチラつきの
改善が見られるということはダブルバッファリングは機能している、これ以上
気になるのであれば、それは滑らかさの問題であってチラつきの問題ではない、
と認識するのが良さそうですね
0379デフォルトの名無しさん (ワッチョイ 7fd3-jSUp)
垢版 |
2018/05/06(日) 21:19:50.71ID:IbwjU9Qn0
下PanelはBackgroundImage使ってるのが悪いんじゃねえかなあ

canvasはPanelのPaintで描画するようにして
PanelのDoubleBufferedをtrueにするかOnPaintBackgroundの無効化でチラ付かなくなったよ

あとチラつきとは関係ないけどお行儀的には再描画はTickで
Invalidate(true)呼び出してPaintのタイミングはフレームワークに任せるべし
Tick毎に無駄にImage/BackgroundImageに突っ込んでるから結果的に自分で再描画してるけど
0381デフォルトの名無しさん (ワッチョイ ea27-0vvG)
垢版 |
2018/05/06(日) 23:08:48.35ID:s/HjZ7Qd0
>>350
それは参照渡しになってたわけじゃない
C#の参照渡しはhoge(ref list)のようにrefがつく
あなたがハマったのは参照の値渡しでインスタンスは複製されないということ

ぺらぺらの入門書とかだとわからんが、ジェネリックやクラスをちゃんと学べる程度の本なら載ってるはず
0383デフォルトの名無しさん (ワッチョイ 8a7f-NrvC)
垢版 |
2018/05/06(日) 23:49:17.66ID:5astaXB20
>>350
List固有の問題ではなく、classは全て参照型だからだ。
だから、=で代入しても同じオブジェクトを指すだけ。
ちなみにstructは値型。こっちなら=で代入したらオブジェクトが複製される。
0387デフォルトの名無しさん (アウアウエー Sa82-oFLj)
垢版 |
2018/05/07(月) 01:42:18.83ID:inVQGvpaa
>>386
それは君が勝手にそう思ってるだけw
そんな問題はWin9xの時代だって存在しなかったよ
っていうか、言っちゃわるいけどフリッカーが発生する原因を理解していればそんな間抜けな台詞は
出てこない
0389デフォルトの名無しさん (ワッチョイ de8a-a7mP)
垢版 |
2018/05/07(月) 04:32:44.15ID:S2Y5gzQd0
DataGridViewで、複数のカラムを基準にソートするにはどうしたらいいでしょうか。
以下のようなイメージです。

元データ
------
4   2
1   4
2   1
5   4
6   7
1   3
1   6

これを、カラムのヘッダーセルのクリック操作だけで、以下のように出来るようにしたいです。
------
1   3
1   4
1   6
2   1
4   2
5   4
6   7
0390デフォルトの名無しさん (ワッチョイ 1e80-pKnf)
垢版 |
2018/05/07(月) 06:24:03.69ID:SlIACPlK0
プロパティだけでは無理
各列のSortModeはAutomatic以外にして
ColumnHeaderClickイベントで自分でソートする必要がある
実際にどうやってソートするかはDataGridViewに表示してるデータをどうやっているか次第
ところで下の状態で1番目の方のカラムヘッダをクリックしたらどうなるの?
とか色々場合があってUIというかUX?を決定するのが結構面倒
0394デフォルトの名無しさん (ワッチョイ 0a5d-N4mI)
垢版 |
2018/05/07(月) 14:38:50.30ID:iApxgodj0
教えてください
キャストが上手くできずに困っています
具体的には、VisualStudioでデバッグのウォッチウィンドウに

Enumerable.Empty<int>() is IEnumerable<object>

と入力するとtrueと表示されるので少なくとも条件が整えば
IEnumerable<int> は IEnumerable<object> に
キャストできるとおもうのですが、プログラム上で安直に

Console.WriteLine(Enumerable.Empty<int>() is IEnumerable<object>);

を実行すると画面にFalseと表示されてしまいます

ウォッチウィンドウ上とプログラム上で何か条件の違いがあって
このようなことが起こっているのだとは思いますが、理解が不十分で解決方法が分かりません

そもそもIEnumerable<T>のTは共変なのでintがobjectにアップキャストできる以上
IEnumerable<int>も無条件でIEnumerable<object>にキャストできると
思っていたのですが、この部分に何か誤解があるのでしょうか

VisualStudio15.6.7、コンソールアプリ、ターゲットフレームワーク4.7.1でテストしています
よろしくお願いします
0396デフォルトの名無しさん (ワッチョイ 0a5d-N4mI)
垢版 |
2018/05/07(月) 21:52:56.92ID:iApxgodj0
>>395
レスどうもありがとうございます。その後色々と試してみると、プログラムで

Console.WriteLine((Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184);

を実行すると画面には184と表示され、教えていただいとことと辻褄が合うように思います
また、これまでの結果から考えてウォッチウィンドウで

(Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184

の値を調べれば4649と表示されるのかなと思いきや「メモリを読み取ることができません」と表示されたので、
こちらの挙動はおっしゃる通り分からない(バグ?)と考えるしかなさそうです

ジェネリックでないIEnumerableはLINQが使えないのでこれまで

if (x is IEnumerable<object> enumerableObject)
{
  ...
}

と書く場面があったのですが、これではIEnumerable<値型>が拾えなさそうなので

if (x is IEnumerable enumerable)
{
  var enumerableObject = enumerable as IEnumerable<object> ?? enumerable.Cast<object>();
  ...
}

とでも書いておこうかと思います(今のプログラムではxがジェネリックでないIEnumerableになることはないのですが)
もっと良い方法があれば教えてもらえると嬉しいです
0397デフォルトの名無しさん (ワッチョイ faeb-r3te)
垢版 |
2018/05/09(水) 00:08:06.32ID:98vw71AM0
名前空間A と名前空間A.B がある場合に、A.B内からAのクラスを扱うにはどうすればいいのですか?
0401デフォルトの名無しさん (ワッチョイ faeb-a7mP)
垢版 |
2018/05/09(水) 02:09:09.87ID:98vw71AM0
>>399
クラスとは違って、やはりそうやって使うものなのですか
0412デフォルトの名無しさん (アウアウエー Sa82-oFLj)
垢版 |
2018/05/09(水) 21:00:22.54ID:EHFfoX53a
>>406
自分(同じチーム)で同じ名前の違うクラスが必要になるケースは
少ないが(ないことはない)他人が書いたライブラリで既に使われているのと
同じ名前が必要になるケースなんかいくらでもあるよw

例えばSystem.Drawing.Point以外のPointが使えなかったら困るでしょ

あと、名前空間の目的は名前のバッティングの回避だけじゃない。
むしろ一番の目的は分類と整理でしょ。
名前空間が使えないライブラリは全部のファイルをデスクトップに置くできない人と同じ

適切に命名され適切な階層構造をもった名前空間は索引の機能を持つし、
コードのコンテキストを明確にする。

System.Drawing.PointがPointだけで2Dグラフィックの座標だと分かるのは、
プログラマはそれがSystem.Drawing内の型だと知っているから
■ このスレッドは過去ログ倉庫に格納されています

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