MW211 EXIT

devlog
C#/データグリッドビューの座標指定
2019年02月20日
DataGridView型(データグリッドビュー)において、以下は同じ。
┌──────────────────────────────────────┐
│データグリッドビュー.Rows[Y].Cells[X].Value                                 │
├──────────────────────────────────────┤
│データグリッドビュー[X, Y].Value                                            │
└──────────────────────────────────────┘
分類:VC#
C#/プロジェクトの流用とGUID
2019年02月13日
VisualStudioでプロジェクトをまるごと流用する場合、
主要なファイルをコピーした上で、プロジェクト名に関わる部分を置換することになる。
この時、GUID変更したいわけだが、変更する方法は、
これまた地道に置換しかないようだ、
但し、適当な新GUIDにしたのでは意味がないので、採番の方法はあるようだ。

【新GUIDの採番方法】
  メニューバー「ツール」より「GUIDの作成」を選択。
  そこで「4.レジストリ形式」を選択し「コピー」ボタンを押下
  (「新規GUID」ボタン押下で別のGUIDが生成される)
  →これでいくつかGUIDを採番しておく

【GUIDの置換】
  秀丸エディタの正規表現であれば、以下でGUIDを洗い出し
  同一GUIDごとに新GUIDに置換していく
┌──────────────────────────────────────┐
│\{\c{8}\-\c{4}\-\c{4}\-\c{4}\-\c{12}\}                                      │
├──────────────────────────────────────┤
│\c{8}\-\c{4}\-\c{4}\-\c{4}\-\c{12}                                          │
└──────────────────────────────────────┘

【アセンブリ情報のGUID】
  アセンブリ情報のGUIDについては、上記でも置換できるが(正規表現的には後者で検索)
  VisualStudioの画面から以下の通り変更することができる。

  「ソリューションエクスプローラー」上の、
  C#プロジェクトの右クリックメニューから「プロパティ」を選ぶ。
  開いた画面にて、左メニューの「アプリケーション」で
  (画面右の)「アセンブリ情報」ボタンを押下。

  「アセンブリ情報」ウインドウにて、「GUID」に貼り付け
  ちなみに「{}」付で貼り付けてもOK(自動で除去される)

  →「\Properties\AssemblyInfo.cs」のGUIDが置換される
分類:VC#
C#/数値(自然数)のチェック
2019年02月11日
┌──────────────────────────────────────┐
│int 数値化;                                                                 │
│if ((!int.TryParse(変数.ToString(), out 数値化)) || (数値化 <= 0)) {        │
│    MessageBox.Show("数値(自然数)を入力してください",                       │
│                    "入力エラー",                                           │
│                    MessageBoxButtons.OK,                                   │
│                    MessageBoxIcon.Exclamation);                            │
│}                                                                           │
└──────────────────────────────────────┘
分類:VC#
C#/DataGridViewで編集中に矢印キーで隣に行かせない
2019年02月10日
DataGridViewで編集中に、先頭で左もしくは末尾で右の矢印キーを押すと
隣のセルに移動していまうという現象がある。
Excelの場合はそうはならないので、C#でもそのようにしようと思ったが
結構苦労した(解決できたがそれがベストプラクティスかもわからない)
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【非編集中のみの制限】
┌──────────────────────────────────────┐
│private void データグリッドビュー_KeyDown(object sender, KeyEventArgs e)    │
│{                                                                           │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        e.Handled = true;                                                   │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
まず、データグリッドビュー本体のKeyDownイベントで制限をかけてみたが
まったく矢印キーを受け付けなくなってしまった。
しかも、マウスを使って編集中にして試してみたら本題の部分が筒抜けだった。
これは、まったくの逆効果だ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【編集中のみの制限】
┌──────────────────────────────────────┐
│private void データグリッドビュー_EditingControlShowing(                    │
│    object sender, DataGridViewEditingControlShowingEventArgs e)            │
│{                                                                           │
│    if (e.Control is DataGridViewTextBoxEditingControl) {                   │
│        DataGridViewTextBoxEditingControl テキストボックス                  │
│            = (DataGridViewTextBoxEditingControl)e.Control;                 │
│        テキストボックス.KeyDown -= new KeyEventHandler(自作イベント);      │
│        テキストボックス.KeyDown += new KeyEventHandler(自作イベント);      │
│    }                                                                       │
│}                                                                           │
│──────────────────────────────────────│
│private void 自作イベント(object sender, KeyEventArgs e)                    │
│{                                                                           │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        //e.Handled = true;                                                 │
│        e.SuppressKeyPress = true;                                          │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
次に、編集中(テキストボックス)のKeyDownイベントで制限をかけてみた。
こちらは、子テキストボックスのイベントを自作する感じなのだが
これだと、編集中はまったく矢印キーを受け付けなくなってしまった反面
こちらも本題の部分が筒抜けだった。
こちらも一つ前のと互角の逆効果バージョンだ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【セルを移動させない】
┌──────────────────────────────────────┐
│private void データグリッドビュー_CellValidating(                           │
│    object sender, DataGridViewCellValidatingEventArgs e)                   │
│{                                                                           │
│    e.Cancel = true;                                                        │
│}                                                                           │
└──────────────────────────────────────┘
で、どうも調べてみると、本題の場合、KeyDownイベントの前に
編集中イベントは解散してるっぽいことがわかった。
つまり、編集中に末尾で右矢印キーを押すと、
PreviewKeyDownイベントは反応するのに、KeyDownイベントはまったく反応しないのだ。
ということで、編集後の方で制御できないものかと方針を変更。
セルが移動した時に(移動しそうになった時に)それを禁止する方法を検証。
これだとまったく制御不能でどうしようもないが、検討的には大きな前進だ。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【編集中から非編集中に変わる直前での制限】
┌──────────────────────────────────────┐
│private bool mIsセル移動禁止;                                               │
├──────────────────────────────────────┤
│public コンストラクタ()                                                     │
│{                                                                           │
│    mIsセル移動禁止 = false;                                                │
│}                                                                           │
├──────────────────────────────────────┤
│private void データグリッドビュー_CellValidating(                           │
│    object sender, DataGridViewCellValidatingEventArgs e)                   │
│{                                                                           │
│    if (mIsセル移動禁止) {                                                  │
│        e.Cancel = true;                                                    │
│    }                                                                       │
│}                                                                           │
├──────────────────────────────────────┤
│private void データグリッドビュー_EditingControlShowing(                    │
│    object sender, DataGridViewEditingControlShowingEventArgs e)            │
│{                                                                           │
│    if (e.Control is DataGridViewTextBoxEditingControl) {                   │
│        DataGridViewTextBoxEditingControl テキストボックス                  │
│            = (DataGridViewTextBoxEditingControl)e.Control;                 │
│        テキストボックス.PreviewKeyDown                                     │
│            -= new PreviewKeyDownEventHandler(自作イベント);                │
│        テキストボックス.PreviewKeyDown                                     │
│            += new PreviewKeyDownEventHandler(自作イベント);                │
│    }                                                                       │
│}                                                                           │
├──────────────────────────────────────┤
│private void 自作イベント(object sender, PreviewKeyDownEventArgs e)         │
│{                                                                           │
│    mIsセル移動禁止 = false;                                                │
│    if ((e.KeyCode == Keys.Right) || (e.KeyData == Keys.Left)) {            │
│        mIsセル移動禁止 = true;                                             │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
ということで、完成。
自作イベントをPreviewKeyDown側に設置し、編集中の矢印キー押下を認識。
それをメンバ変数で伝達し、さきほどのセル移動させない処理にて
その制限を限定することにより、思った通りの動作となった。
分類:VC#
VC#/listViewのセルに入力するには
2018年07月10日
ダブルクリックすると入力モードになるには以下のパラメータを変えればよい。
┌──────────┐
│動作                │
│┌─────┬───┤
││LabelEdit │True  │(←False)
└┴─────┴───┘
でも、F2は効かないようだ。

ただ、参照専用にしたいのであればこれはいじらない方がよいかも。
分類:VC#
VC#/ListViewのヘッダ設定
2018年07月08日
以下のように親フォームのロード時に、列を追加することによりヘッダ列が設定できる。
┌──────────────────────────────────────┐
│private void フォーム_Load(object sender, EventArgs e)                      │
│{                                                                           │
│    リストビュー.View = View.Details;                                       │
│    リストビュー.Columns.Add("一列目");                                     │
│    リストビュー.Columns.Add("二列目");                                     │
│    リストビュー.Columns.Add("三列目");                                     │
│}                                                                           │
└──────────────────────────────────────┘
なお、詳細表示モード(View.Details)でないとヘッダは表示されない。
分類:VC#
VC#/列幅を自動調整する方法
2018年07月07日
境界線でダブルクリックすると値に応じで自動で伸縮するが、
それをC#のListViewで行う方法。

┌──────────────────────────────────────┐
│ヘッダカラム.Width = -1;                                                    │
└──────────────────────────────────────┘
ヘッダカラムの横幅(.Width)に「-1」を代入すればよい。

全ての列にそれを適用する例は以下の通り。
┌──────────────────────────────────────┐
│foreach (ColumnHeader ヘッダカラム in リストビュー.Columns)                 │
│{                                                                           │
│    ヘッダカラム.Width = -1;                                                │
│}                                                                           │
└──────────────────────────────────────┘
分類:VC#
VC#/textBoxの縦幅を拡大する
2018年07月06日
既定では一行なので、複数行OKに変更すればよい。
┌──────────┐
│動作                │
│┌─────┬───┤
││Multiline │True  │(←False)
└┴─────┴───┘
分類:VC#
前へ 1 次へ