有没有办法让ListBox中的某些项目只读/禁用,因此无法选择它们?或者ListBox有任何类似的控件来提供此功能吗?
答案 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;
,用户可以滚动浏览许多选择,但不会因更改而弄乱。