带有只读/禁用项的WinForms ListBox

时间:2010-03-13 11:40:37

标签: winforms listbox

有没有办法让ListBox中的某些项目只读/禁用,因此无法选择它们?或者ListBox有任何类似的控件来提供此功能吗?

5 个答案:

答案 0 :(得分:4)

ListBox不支持。你可以打开一些东西,你可以取消选择一个选定的项目。这是一个阻止选择偶数项目的愚蠢示例:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
  for (int ix = listBox1.SelectedIndices.Count - 1; ix >= 0; ix--) {
    if (listBox1.SelectedIndices[ix] % 2 != 0) 
      listBox1.SelectedIndices.Remove(listBox1.SelectedIndices[ix]);
  }
}

但闪烁非常明显,它会弄乱键盘导航。使用CheckedListBox可以获得更好的结果,您可以阻止用户选中项目的框:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
  if (e.Index % 2 != 0) e.NewValue = CheckState.Unchecked;
}

但是现在你不能覆盖绘图,使用户看起来不明显该项目是不可选择的。这里没有很好的解决方案,只是不在框中显示不应该选择的项目要简单得多。

答案 1 :(得分:1)

@Hans解决方案导致短时间内选择了项目ID,然后选择消失。我不喜欢这样 - 这可能让最终用户感到困惑。

我更喜欢为应该禁用的项目隐藏一些编辑选项按钮:

        if (lbSystemUsers.Items.Count > 0 && lbSystemUsers.SelectedIndices.Count > 0)
            if (((RemoteSystemUserListEntity)lbSystemUsers.SelectedItem).Value == appLogin)
            {
                bSystemUsersDelete.Visible = false;
                bSystemUsersEdit.Visible = false;                    
            }
            else
            {
                bSystemUsersDelete.Visible = true;
                bSystemUsersEdit.Visible = true;
            }

以下是列出用户的列表,不允许编辑实际登录到编辑面板的用户。

答案 2 :(得分:1)

ReadOnly没有ListBox(或类似)属性,但您可以进行自定义public class ReadOnlyListBox : ListBox { private bool _readOnly = false; public bool ReadOnly { get { return _readOnly; } set { _readOnly = value; } } protected override void DefWndProc(ref Message m) { // If ReadOnly is set to true, then block any messages // to the selection area from the mouse or keyboard. // Let all other messages pass through to the // Windows default implementation of DefWndProc. if (!_readOnly || ((m.Msg <= 0x0200 || m.Msg >= 0x020E) && (m.Msg <= 0x0100 || m.Msg >= 0x0109) && m.Msg != 0x2111 && m.Msg != 0x87)) { base.DefWndProc(ref m); } } } 控件。这是一个对我来说非常好的解决方案:

https://ajeethtechnotes.blogspot.com/2009/02/readonly-listbox.html

{{1}}

答案 3 :(得分:0)

我知道这是旧帖子,但我将来会为其他读者发布一个解决方法。

listBox.Enabled = false;
listBox.BackColor = Color.LightGray;

这会将列表框的背景颜色更改为浅灰色。所以这不是内置的&#34;本地方式&#34;要做到这一点,但至少给用户一些他不应该/不能编辑该领域的反馈。

答案 4 :(得分:0)

要获得只读行为,我需要MyCBLLocked(与MyCBL复选框列表控件关联的布尔值),并在CheckItem事件上执行该操作:

private void MyCBL_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (MyCBLLocked)
        e.NewValue = e.CurrentValue;
    }

所以不是

MyCBL.Enabled = false;

我使用

MyCBLLocked = true;

,用户可以滚动浏览许多选择,但不会因更改而弄乱。