【问题标题】:Enable ListBox's ScrollBar even when the ListBox is Disabled?即使禁用 ListBox 也启用 ListBox 的 ScrollBar?
【发布时间】:2013-12-15 10:42:28
【问题描述】:

我有一个列表框,其中包含启用多选的(预定义)项目,为了防止人为错误,我放置了一个复选框来锁定列表框,以便在选中复选框时无法选择任何项目。

好吧,我想做的是在列表框被禁用时重新启用列表框垂直滚动条(它是默认控件滚动条),让我看到如果我想看到它们被选中的项目,只是为了使用滚动条在列表框上向上/向下导航,就是这样。

这可能吗?

这是ListBox,它只有一个垂直滚动条,没有水平滚动条:

【问题讨论】:

  • 看起来您的ListBox 支持某些编辑功能?如果没有,为什么必须禁用它?防止用户选择某些项目? ...
  • @King King 不,这是一个默认的列表框,只是有时我错误地点击了一个我真的不会选择的项目,直到后来我才注意到我的错。这只是一种时尚,当列表框被禁用时,我必须使用滚动条浏览列表框项目(我认为这是一个不错的功能)。对不起我的英语
  • 目前还不清楚为什么你必须禁用该列表框,我们总是可以有一些解决方法,一旦被禁用,我认为没有办法启用 just滚动条,至少禁用状态的滚动条外观很难转为正常状态。
  • @King King 我想到了另一种解决方法,它可能是管理鼠标点击事件而不是完全禁用控件,但我没有尝试过。我禁用了列表框以取消单击任何项​​目,但我希望能够仍然使用滚动条
  • 完成了我的朋友 :),这是一个很好的答案。

标签: c# .net vb.net winforms listbox


【解决方案1】:

如果您只想阻止用户与列表框交互,同时仍允许他使用滚动条,那么这应该可以解决问题。我制作了一个自定义 ListBox,它支持将 listBox 置于 只读模式 的某些功能:

public class CustomListBox : ListBox
{
    public bool ReadOnly { get; set; }
    protected override void WndProc(ref Message m)
    {
        //WM_LBUTTONDOWN = 0x201
        //WM_KEYDOWN = 0x100
        if (ReadOnly && (m.Msg == 0x201 || m.Msg == 0x100)) {
          Focus();//do this to allow mouse wheeling
          return;
        }
        base.WndProc(ref m);
    }        
}

用法:只需要将ReadOnly属性设置为true即可:

customListBox1.ReadOnly = true;

请注意,它只是防止鼠标左键按下以及鼠标左键单击。如果您需要阻止用户做更多的事情,例如阻止鼠标按下,您可以捕获并过滤掉WM_RBUTTONDOWN消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 2016-01-12
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多