WindowsFormアプリケーションでListViewを使っていたのですが
これにチェックボックスをつけれるのを知って前回作ってみました
チェックを付けたい行をシングルクリックすることで
チェックボックスにチェックが付くかなあと思っていたのですが
デフォルトでチェックボックスを出しただけだとチェックされない…
クリックした行が青く反転するのもなんだかなあと
次のような動きになったら嬉しいなあと、ほんのちょっとカスタムしてみます
・アイテムのクリックでもチェックボックスのオンオフができる
・クリックしたアイテムが選択状態(青く反転)しないようにする
※もっと正当で楽な方法もあると思いますが、うまく調べられなかったのでメモ
※この記事はキーボード操作のことを全く考えていません
動かすサンプル
Form1にオリジナル(初めからツールボックスにある)のListViewと、
カスタムしたListViewを貼り付けました
上のOriginalListViewというカラム名になってるほうがオリジナルで
下のNewListViewというカラム名になっているほうが今回カスタムしたほうです
ちなみに上下ともViewはDetailsです
Form1.cs
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.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
{
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つ目のチェックボックスをクリックします
チェックボックスの選択状態が解除されました
ちなみにこの後、一応選択状態になっている行のアイテムをクリックしてみましたが
ちゃんとチェックボックスは解除されました
残課題メモ
アイテムクリックでチェックボックスのオンオフができるようになったのは
マウス操作が雑な自分からしたらとても助かりますが、
アイテムをクリックしたときに一瞬選択行が反転するのを何とかしたい…