DataGridViewでヘッダーセルの結合を行う場合

DataGridViewでヘッダーセルの結合を行う場合、DataGridViewに既定で用意されている「CellPainting」イベントを使う。
以下は、2列目と3列目を結合して、「あああああああああああああああああ」と表示する場合の例です。

 private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            // ガード句
            if (e.RowIndex > -1)
            {
                // ヘッダー以外は処理なし
                return;
            }

            //2〜3列目を結合する処理
            if (e.ColumnIndex == 1)
            {
                // 処理対象セルが、2列目の場合のみ処理を行う
                // セルの矩形を取得
                Rectangle rect = e.CellBounds;

                DataGridView dgv = (DataGridView)sender;

                // 3列目の幅を取得して、2列目の幅に足す
                rect.Width += dgv.Columns[2].Width;

                // 矩形の位置を補正
                rect.X -= 1;
                rect.Y -= 2;

                // 背景、枠線、セルの値を描画
                using (SolidBrush brush = new SolidBrush(dataGridView1.ColumnHeadersDefaultCellStyle.BackColor))
                {
                    // 背景の描画
                    e.Graphics.FillRectangle(brush,rect);
                    
                    using (Pen pen = new Pen(dgv.GridColor))
                    {
                        // 枠線の描画
                        e.Graphics.DrawRectangle(pen, rect);
                    }
                }

                // テキストの位置を調整
                rect.Y += 2;
                // セルに表示するテキストを描画
                TextRenderer.DrawText(e.Graphics,
                                "あああああああああああああああああ",
                                e.CellStyle.Font,
                                rect,
                                e.CellStyle.ForeColor,
                                TextFormatFlags.HorizontalCenter
                                | TextFormatFlags.VerticalCenter);
            }

            // 結合セル以外は既定の描画を行う
            if (!(e.ColumnIndex == 1 || e.ColumnIndex == 2))
            {
                e.Paint(e.ClipBounds, e.PaintParts);
            }

            // イベントハンドラ内で処理を行ったことを通知
            e.Handled = true;
        }

DataGridViewでやってはいけないこと

ラジオボタンを埋め込もうとすること
 →標準で用意されていない。作るの大変。
 →表示だけはラジオボタン風になっても、ラジオボタンのような制御は制御で実装しなければならない。
・カレンダーコントロールを埋め込もうとすること
 →標準で用意されていない。作るの大変。

色々大変なのです。
大変だからと言って、やらなくっていいわけではないので、余計に大変なのです。

DataGridView描画

最近放置気味だったので。久々に。。。

ここ最近はDataGridViewに苦戦しています。
DataGridViewって簡単にセル結合とかできないし、標準で用意されていないラジオボタンとかのコントロールを埋め込むのも大変。
まだ苦戦中なので、そのへんをあとでめとめて記録しておこうと思います。

ほんとFlexGridすげーっす。使ったことないけど。

VisualStudioの便利機能について

①行選択とかしなくても、カーソルのある行で、ctrl+c、ctrl+xでコピーも切り取りもできるって知ってびっくり。あ、1行だけね。
切り取りはshift+deleteでもできる。

②矩形選択ができる。
マウス操作のときは、altキー押しながら。キーボードで操作するときはalt+shift+矢印ボタン。
たまに矩形選択したくなるときあるからちょー便利。

③コードの整形。ctrl+e,d

コメントアウトと解除。
コメントアウト。ctrl+e,c
解除。ctrl+e,u

⑤ソースの検索。ctrl+shift+f。(ctrl+fの検索とは違う。)

自作のカスタムコントロールをツールボックスに入れる

<その1>
ツールボックス上で右クリック→「アイテムの選択」→「選択」から対象のDLLを選ぶ

<その2>
メニューバーの「ツール」→「ツールボックス アイテムの選択」→「選択」から対象のDLLを選択

ITシステム業界について

ITシステム業界において、、、

単価の高い会社ほど生産性も高いのだろうか。
単価の低い会社は生産性も低いのだろうか。

短い工期であっても高い生産性を発揮してくれたら、単価の高い会社に発注する価値がある(?)
単価が安いからって発注しても、工期が長かったら、トータルコストは高くつく(?)

例えばモノを買う場合、大抵高いものは、高いだけの価値がある。これは誰が見ても判断できると思う。
ただ、IT業界において言うと、単価が高いからといって、必ずしもその価値に見合ったモノが出来上がるのかというと、クエスチョンマークだ。

単純に単価だけで、トータル的な高い、安いを判断することはできない。

このあとに肝心なこと書きたかったんだけど、何が言いたかったのか忘れちゃった。思い出したらまた書こうっと。

DataTable.Compute

DataTable.Computeメソッドがチョー便利そう。
引数に抽出条件も指定できるから、抽出条件で指定したデータの中の、最大値、最小値やら総和の計算したりできるみたい。
使う機会あったら使ってみよ。

DataTable.Compute(String, String) Method (System.Data) | Microsoft Docs
DataColumn.Expression Property (System.Data) | Microsoft Docs