using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ListView_CheckBox { public partial class Form1 : Form { private int m_SelectedItemIndex = -1; private ItemCheckEventHandler m_ItemCheckhandler; private object m_ListviewLock = new object(); public Form1() { InitializeComponent(); m_ItemCheckhandler = new ItemCheckEventHandler(this.listView1_ItemChecked); } private void listView1_ItemChecked(object sender, ItemCheckEventArgs e) { SetSelectedItem(e.Index); Cursor.Current = Cursors.WaitCursor; string whoami = System.Reflection.MethodBase.GetCurrentMethod().Name; try { HandleItemCheckedEvent(false); ListViewItemEx item = GetSelectedItem(); if (e.NewValue == CheckState.Unchecked) { MoveToBottom(e.Index); SetSelectedItem(item.Index); } else if (e.NewValue == CheckState.Checked) { int index = 0; MoveToTop(e.Index, index); SetSelectedItem(item.Index); } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } finally { HandleItemCheckedEvent(true); Cursor.Current = Cursors.Default; } } public int MoveToBottom(int itemIndex) { lock (m_ListviewLock) { int bottomIndex = listView1.Items.Count - 1; if (itemIndex == bottomIndex) { return bottomIndex; } // move the item listView1.BeginUpdate(); ListViewItem cachedItem = listView1.Items[itemIndex]; listView1.Items.RemoveAt(itemIndex); listView1.Items.Insert(bottomIndex, cachedItem); RefreshItems(0); listView1.EndUpdate(); return bottomIndex; } } public int MoveToTop(int itemIndex, int newIndex) { if (itemIndex == newIndex) { return newIndex; } lock (m_ListviewLock) { // move the item listView1.BeginUpdate(); ListViewItem cachedItem = listView1.Items[itemIndex]; listView1.Items.RemoveAt(itemIndex); listView1.Items.Insert(newIndex, cachedItem); RefreshItems(0); listView1.EndUpdate(); return newIndex; } } public void SetSelectedListItem(int index) { listView1.Items[index].Selected = true; } public int SetSelectedItem(int selectedItemIndex) { // set the selected item in the ListView if (selectedItemIndex >= 0 && selectedItemIndex < listView1.Items.Count) { SetSelectedListItem(selectedItemIndex); listView1.EnsureVisible(selectedItemIndex); m_SelectedItemIndex = selectedItemIndex; } return m_SelectedItemIndex; } public ListViewItemEx GetSelectedItem() { ListViewItemEx item = null; ListView.SelectedListViewItemCollection items = listView1.SelectedItems; int count = items.Count; if (count > 0) { item = items[0] as ListViewItemEx; } return item; } protected internal void HandleItemCheckedEvent(bool handleEvent) { //ItemCheckEventHandler handler = new ItemCheckEventHandler(this.listView1_ItemChecked); if (handleEvent) { listView1.ItemCheck += m_ItemCheckhandler; } else { listView1.ItemCheck -= m_ItemCheckhandler; } } private void RefreshItems(int index) { for (int i = index; i < listView1.Items.Count; i++) { // make sure the ListViewItem is something that can refresh ListViewItemEx item = listView1.Items[i] as ListViewItemEx; if (item != null) { item.Refresh(); } } } private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { ListViewItemEx itemEx = new ListViewItemEx(i.ToString()); listView1.Items.Add(itemEx); } for (int i = 0; i < listView1.Items.Count; i++) { // make sure the ListViewItem is something that can refresh ListViewItemEx item = listView1.Items[i] as ListViewItemEx; if (item != null) { item.Refresh(); } } HandleItemCheckedEvent(true); SetSelectedItem(0); } public class ListViewItemEx : ListViewItem { private string m_ItemExObject; #region CTOR public ListViewItemEx(string itemEx) : base() { m_ItemExObject = itemEx; } #endregion public virtual void Refresh() { String whoami = System.Reflection.MethodBase.GetCurrentMethod().Name; if (ListView == null) { return; } // make sure the item and ListView columns are in sync int columnCount = ListView.Columns.Count; if (columnCount != SubItems.Count - 1) { SubItems.Clear(); for (int i = 0; i < columnCount; i++) { SubItems.Add(String.Empty); } } // now setup each item column for (int i = 1; i < ListView.Columns.Count; i++) { ColumnHeader columnHeader = (ColumnHeader)ListView.Columns[i]; ListViewItem.ListViewSubItem subitem = this.SubItems[i]; subitem.Text = m_ItemExObject + i.ToString(); } } } } }