【残課題あり】Listviewのチェックボックスをアイテムからチェックしたい | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

WindowsFormアプリケーションでListViewを使っていたのですが

これにチェックボックスをつけれるのを知って前回作ってみました

 

チェックを付けたい行をシングルクリックすることで

チェックボックスにチェックが付くかなあと思っていたのですが

デフォルトでチェックボックスを出しただけだとチェックされない…

クリックした行が青く反転するのもなんだかなあと

 

次のような動きになったら嬉しいなあと、ほんのちょっとカスタムしてみます

・アイテムのクリックでもチェックボックスのオンオフができる

・クリックしたアイテムが選択状態(青く反転)しないようにする

※もっと正当で楽な方法もあると思いますが、うまく調べられなかったのでメモ

※この記事はキーボード操作のことを全く考えていません

 

 

動かすサンプル 

Form1にオリジナル(初めからツールボックスにある)のListViewと、

カスタムしたListViewを貼り付けました

 

上のOriginalListViewというカラム名になってるほうがオリジナルで

下のNewListViewというカラム名になっているほうが今回カスタムしたほうです

ちなみに上下ともViewはDetailsです

 

 Form1.cs

using System;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 1; i <= 3; i++)
            {
                listView1.Items.Add(i + "つめのデータ"); // OriginalListView
                customListView1.Items.Add(i + "つめのデータ"); // NewListView
            }
        }
    }
}

Form1の画面読み込み処理で上下どちらのListViewにも

とりあえずアイテムを設定してもらいます

 

 

 

 customListView.cs

using System;
using System.Windows.Forms;

namespace TestApp
{
    public partial class customListView : ListView
    {
        public customListView()
        {
            InitializeComponent();
            this.View = View.Details;
            this.CheckBoxes = true;
            this.Columns.Add("NewListView", 150);

        }

        protected override void OnClick(EventArgs e)
        {
            if (this.SelectedItems.Count > 0)
            {
                this.SelectedItems[0].Checked = !this.SelectedItems[0].Checked;
                this.SelectedItems[0].Selected = false;
            }
        }

    }
}

カスタム(ユーザー)コントロールを作成しました

ListViewのクリックイベントで、選択中のアイテムがあれば

チェック状態を反転し、選択状態をオフにしてもらいます

 

めんどくさいのでとりあえず初期状態から

ビューはDetailsで、適当なカラムを1つ追加しています

 

 

 customListView.Designer.cs

namespace TestApp
{
    partial class customListView
    {
        /// <summary> 
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region コンポーネント デザイナーで生成されたコード

        /// <summary> 
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        }

        #endregion
    }
}

上でListViewを継承したときにエラーが出たのでついでに記載

青い個所をコメントアウトしました

コード エディターで変更しないでください。って気のせいだよね

 

 

実行結果 

 

オリジナルとカスタム両方同じ操作をして試してみました

操作は

①1つめのアイテムをクリック

②2つめのアイテムをクリック

③3つめのチェックボックスをクリック

④3つめのチェックボックスをクリック

です

 

画面起動直後は全てのチェックボックスがオフになっています

 

 

 オリジナル

まず、オリジナルのほうから動かします

1つめのアイテムをクリックしてみました

チェックボックスは選択状態になりません

 

2つめのアイテムをクリックしてみます

もちろんチェックボックスは選択状態になりません

 

3つめのチェックボックスをクリックしてみます

2つめのアイテムが反転したまま

3つめのチェックボックスが選択状態になりました

 

再度3つめのチェックボックスをクリックしてみます

3つ目のチェックボックスの選択状態が解除されました

 

チェックボックスはオン/オフにできるので

問題はないですが、やっぱりちょっと不満

 

 

 カスタム

次にカスタムしたほうを動かしてみます

1つめのアイテムをクリックしてみました

チェックボックスは選択状態になりました

 

1つめのアイテムの選択状態は画像ではオフになっていますが、

実際はクリックしたとき一瞬だけ青く反転しています

 

2つ目のアイテムをクリックしてみます

これも同じようにチェックボックスが選択されました

 

3つ目のチェックボックスをクリックしてみます

チェックボックスのクリックでも想定通りに選択状態となっています

 

再度3つ目のチェックボックスをクリックします

チェックボックスの選択状態が解除されました

ちなみにこの後、一応選択状態になっている行のアイテムをクリックしてみましたが

ちゃんとチェックボックスは解除されました

 

 

残課題メモ 

 

アイテムクリックでチェックボックスのオンオフができるようになったのは

マウス操作が雑な自分からしたらとても助かりますが、

アイテムをクリックしたときに一瞬選択行が反転するのを何とかしたい…