前提・実現したいこと
WinFormsのListViewで、項目以外の余白をクリックしても選択を解除せずに、常に1つの項目を選択するようにしたいです。
ListViewから項目を選択してOKボタンを押すようなUIで、OKボタンを押してなにも選択されていなかった際に、いちいち「項目を選択してください」とエラーを出すより、そもそも「なにも選択されていない」という状況を生み出せないように、上記のようなことをしたいです。
発生している問題・エラーメッセージ
ItemSelectionChangedのイベントハンドラで、「余白の部分にマウスカーソルがあり、選択を解除している」場合に、解除した項目を再選択させるようにしたのですが(該当のソースコード を参照)、
1.item2 か item3 を選択
2.ListViewの項目以外の余白部分をクリック
3.1で item2 を選択した場合はitem1を、item3 を選択した場合はitem2かitem1を選択
上記の手順を踏むと、1で選択した項目に、選択状態が残ったままになってしまいます。
ListViewのMultiSelectプロパティをtrueにすれば、この現象自体は回避できるのですが、選択できる項目は1つだけにしたいです。
この現象を回避(選択状態が残らないように)し、選択できる項目は1つだけとするには、どうすればいいのでしょうか?
ご教示ください。
該当のソースコード
Form1.Designer.cs
C#
1namespace WindowsFormsApp1 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("item1"); 32 System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("item2"); 33 System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("item3"); 34 this.listView1 = new System.Windows.Forms.ListView(); 35 this.SuspendLayout(); 36 // 37 // listView1 38 // 39 this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 40 | System.Windows.Forms.AnchorStyles.Left) 41 | System.Windows.Forms.AnchorStyles.Right))); 42 this.listView1.HideSelection = false; 43 this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { 44 listViewItem1, 45 listViewItem2, 46 listViewItem3}); 47 this.listView1.Location = new System.Drawing.Point(0, 0); 48 this.listView1.MultiSelect = false; 49 this.listView1.Name = "listView1"; 50 this.listView1.Size = new System.Drawing.Size(583, 262); 51 this.listView1.TabIndex = 0; 52 this.listView1.UseCompatibleStateImageBehavior = false; 53 this.listView1.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.listView1_ItemSelectionChanged); 54 // 55 // Form1 56 // 57 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 58 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 59 this.ClientSize = new System.Drawing.Size(584, 261); 60 this.Controls.Add(this.listView1); 61 this.Name = "Form1"; 62 this.Text = "Form1"; 63 this.ResumeLayout(false); 64 65 } 66 67 #endregion 68 69 private System.Windows.Forms.ListView listView1; 70 } 71}
Form1.cs
C#
1using System; 2using System.Windows.Forms; 3 4namespace WindowsFormsApp1 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 } 12 13 private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 14 { 15 var mousePos = listView1.PointToClient(Cursor.Position); 16 if (listView1.GetItemAt(mousePos.X, mousePos.Y) == null && e.IsSelected == false) 17 { 18 Console.WriteLine($"選択解除させない ItemIndex: {e.ItemIndex}, IsSelected: {e.IsSelected}"); 19 e.Item.Selected = true; 20 } 21 } 22 } 23}
補足情報(FW/ツールのバージョンなど)
- .NET Framework 4.7.2
- Visual Studio 2019
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/29 09:47