Here you go, uses a custom list box taken from this post and modified a bit along with adding a property to your ListItem to make life easier for disabling. If you don't want the extra property then you need to use another method to get the indices of items to disable, if they are always the same then hard code it
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace ListBoxDisableApp
{
public class ListBoxEx : ListBox
{
public event EventHandler<IndexEventArgs> DisabledItemSelected;
protected virtual void OnDisabledItemSelected(object sender, IndexEventArgs e)
{
if (DisabledItemSelected != null)
{
DisabledItemSelected(sender, e);
}
}
public ListBoxEx()
{
DrawMode = DrawMode.OwnerDrawFixed;
disabledIndices = new DisabledIndexCollection(this);
}
private int originalHeight = 0;
private bool fontChanged = false;
protected override void OnFontChanged(EventArgs e)
{
base.OnFontChanged(e);
fontChanged = true;
ItemHeight = FontHeight;
Height = GetPreferredHeight();
fontChanged = false;
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (!fontChanged)
originalHeight = Height;
}
public void DisableItem(int index)
{
disabledIndices.Add(index);
}
public void EnableItem(int index)
{
disabledIndices.Remove(index);
}
private int GetPreferredHeight()
{
if (!IntegralHeight)
return Height;
int currentHeight = this.originalHeight;
int preferredHeight = PreferredHeight;
if (currentHeight < preferredHeight)
{
// Calculate how many items currentheigh can hold.
int number = currentHeight / ItemHeight;
if (number < Items.Count)
{
preferredHeight = number * ItemHeight;
int delta = currentHeight - preferredHeight;
if (ItemHeight / 2 <= delta)
{
preferredHeight += ItemHeight;
}
preferredHeight += (SystemInformation.BorderSize.Height * 4) + 3;
}
else
{
preferredHeight = currentHeight;
}
}
else
preferredHeight = currentHeight;
return preferredHeight;
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
int currentSelectedIndex = SelectedIndex;
List<int> selectedDisabledIndices = new List<int>();
for (int i = 0; i < SelectedIndices.Count; i++)
{
if (disabledIndices.Contains(SelectedIndices[i]))
{
selectedDisabledIndices.Add(SelectedIndices[i]);
SelectedIndices.Remove(SelectedIndices[i]);
}
}
foreach (int index in selectedDisabledIndices)
{
IndexEventArgs args = new IndexEventArgs(index);
OnDisabledItemSelected(this, args);
}
if (currentSelectedIndex == SelectedIndex)
base.OnSelectedIndexChanged(e);
}
protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
{
base.OnDrawItem(e);
if (DesignMode && Items.Count == 0)
{
return;
}
if (e.Index != ListBox.NoMatches)
{
object item = this.Items[e.Index];
if (disabledIndices.Contains(e.Index))
{
e.Graphics.FillRectangle(SystemBrushes.InactiveBorder, e.Bounds);
if (item != null)
{
e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.GrayText, e.Bounds);
}
}
else
{
if (SelectionMode == System.Windows.Forms.SelectionMode.None)
{
e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
if (item != null)
{
e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.WindowText, e.Bounds);
}
}
else
{
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
e.DrawFocusRectangle();
if (item != null)
{
e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.HighlightText, e.Bounds);
}
}
else
{
e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
if (item != null)
{
e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.WindowText, e.Bounds);
}
}
}
}
}
}
private DisabledIndexCollection disabledIndices;
public DisabledIndexCollection DisabledIndices => disabledIndices;
public class DisabledIndexCollection : IList, ICollection, IEnumerable
{
// Fields
private ListBox owner;
private List<int> innerList = new List<int>();
// Methods
public DisabledIndexCollection(ListBox owner)
{
this.owner = owner;
}
public void Add(int index)
{
if (((owner != null) && (owner.Items != null)) && ((index != -1) && !Contains(index)))
{
innerList.Add(index);
owner.SetSelected(index, false);
}
}
public void Clear()
{
if (owner != null)
{
innerList.Clear();
}
}
public bool Contains(int selectedIndex)
{
return (IndexOf(selectedIndex) != -1);
}
public void CopyTo(Array destination, int index)
{
int count = Count;
for (int i = 0; i < count; i++)
{
destination.SetValue(this[i], (int)(i + index));
}
}
public IEnumerator GetEnumerator()
{
return new SelectedIndexEnumerator(this);
}
public int IndexOf(int selectedIndex)
{
if ((selectedIndex >= 0) && (selectedIndex < this.owner.Items.Count))
{
for (int index = 0; index < innerList.Count; index++)
{
if (innerList[index] == selectedIndex)
return index;
}
}
return -1;
}
public void Remove(int index)
{
if (((owner != null) && (owner.Items != null)) && ((index != -1) && Contains(index)))
{
innerList.Remove(index);
owner.SetSelected(index, false);
}
}
int IList.Add(object value)
{
throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
void IList.Clear()
{
throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
bool IList.Contains(object selectedIndex)
{
return ((selectedIndex is int) && Contains((int)selectedIndex));
}
int IList.IndexOf(object selectedIndex)
{
if (selectedIndex is int)
{
return IndexOf((int)selectedIndex);
}
return -1;
}
void IList.Insert(int index, object value)
{
throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
void IList.Remove(object value)
{
throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
void IList.RemoveAt(int index)
{
throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
// Properties
[Browsable(false)]
public int Count => this.innerList.Count;
public bool IsReadOnly => true;
public int this[int index] => IndexOf(index);
bool ICollection.IsSynchronized => true;
object ICollection.SyncRoot => this;
bool IList.IsFixedSize => true;
object IList.this[int index]
{
get => this[index];
set => throw new NotSupportedException("ListBoxSelectedIndexCollectionIsReadOnly");
}
// Nested Types
private class SelectedIndexEnumerator : IEnumerator
{
// Fields
private int current;
private ListBoxEx.DisabledIndexCollection items;
// Methods
public SelectedIndexEnumerator(DisabledIndexCollection items)
{
this.items = items;
this.current = -1;
}
bool IEnumerator.MoveNext()
{
if (current < (items.Count - 1))
{
this.current++;
return true;
}
this.current = this.items.Count;
return false;
}
void IEnumerator.Reset()
{
this.current = -1;
}
// Properties
object IEnumerator.Current
{
get
{
if ((this.current == -1) || (this.current == this.items.Count))
{
throw new InvalidOperationException("ListEnumCurrentOutOfRange");
}
return this.items[this.current];
}
}
}
}
public new void SetSelected(int index, bool value)
{
int num = (Items == null) ? 0 : Items.Count;
if ((index < 0) || (index >= num))
{
throw new ArgumentOutOfRangeException("index");
}
if (SelectionMode == SelectionMode.None)
{
throw new InvalidOperationException("ListBoxInvalidSelectionMode");
}
if (!disabledIndices.Contains(index))
{
if (!value)
{
if (SelectedIndices.Contains(index))
SelectedIndices.Remove(index);
}
else
{
base.SetSelected(index, value);
}
}
// Selected index deoes not change, however we should redraw the disabled item.
else
{
if (!value)
{
// Remove selected item if it is in the list of selected indices.
if (SelectedIndices.Contains(index))
SelectedIndices.Remove(index);
}
}
Invalidate(GetItemRectangle(index));
}
}
public class IndexEventArgs : EventArgs
{
private int index;
public int Index
{
get => index;
set => index = value;
}
public IndexEventArgs(int index)
{
Index = index;
}
}
}
ListItem
public class ListItem
{
public bool Disable { get; set; }
public string Name { get; set; }
public override string ToString() => Name;
}
Form code
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Shown += OnShown;
}
private void OnShown(object sender, EventArgs e)
{
listBox1.Items.Add(new ListItem { Name = "LocalMachine" });
listBox1.Items.Add(new ListItem { Name = "============", Disable = true});
listBox1.Items.Add(new ListItem { Name = "runKey_" });
listBox1.Items.Add(new ListItem { Name = "runKey_A" });
listBox1.Items.Add(new ListItem { Name = "runKey_B" });
listBox1.Items.Add(new ListItem { Name = "runKey_C" });
listBox1.Items.Add(new ListItem { Name = "runKey_D" });
listBox1.Items.Add(new ListItem { Name = "" });
listBox1.Items.Add(new ListItem { Name = "CurrentUser" });
listBox1.Items.Add(new ListItem { Name = "============", Disable = true });
listBox1.Items.Add(new ListItem { Name = "runKey1_" });
listBox1.Items.Add(new ListItem { Name = "runKey_AA" });
listBox1.Items.Add(new ListItem { Name = "runKey_BB" });
listBox1.Items.Add(new ListItem { Name = "runKey_CC" });
listBox1.Items.Add(new ListItem { Name = "runKey_DD" });
var items = listBox1.Items.OfType<ListItem>()
.Select((item, index) => new { Index = index, Item = item })
.Where(x => x.Item.Disable)
.ToList();
foreach (var item in items)
{
listBox1.DisableItem(item.Index);
}
}
}
EDIT
Place a button on the form named SelectedButton, add the following code to get the current item if not disabled.
private void SelectedButton_Click(object sender, EventArgs e)
{
var current = (ListItem)listBox1.SelectedItem;
MessageBox.Show(current != null ? $"{current.Name} {current.Disable}" : $"Disabled item");
}