【问题标题】:How to prevent a user from selecting an item in a listbox, but still letting code select an item? Prefer not to use enabled = false如何防止用户选择列表框中的项目,但仍然让代码选择项目?不喜欢使用 enabled = false
【发布时间】:2020-07-11 18:02:38
【问题描述】:

我正在为学校制作一个带有算法的 Windows 窗体应用程序,我想添加一些不错的功能来显示该算法运行良好。其中之一是当用户在一个列表框中选择一个项目时,属于该项目的项目会自动在另一个列表框中选择。这是由应用程序完成的。

如果用户无法在自动监控的列表框中选择另一个项目,但 enabled = false 将颜色设置为灰色,这使得自动选择项目时文本不可见,我希望它。

还有其他方法可以实现吗?

【问题讨论】:

  • 您可以在禁用时更改颜色。检查这个:stackoverflow.com/questions/15773669/…
  • 命名你的两个列表框,为你的问题添加一些图片有助于解释。
  • 例如,我不确定您的第二段的“列表框”是“一个列表框”还是“另一个列表框”。命名将有助于明确你的目标。
  • 您可以尝试使用自定义列表框控件类,例如here。这个想法是在 ReadOnly 模式设置为 ON 时使用覆盖的窗口 proc 处理程序忽略某些 Windows 事件
  • @MyBug18 更改颜色无助于滚动禁用的列表框控件。您必须确保所选项目对用户另外可见

标签: c# visual-studio winforms windows-forms-designer


【解决方案1】:

你能做的是

  • 当程序在第二个列表中选择一个条目时,设置一个标志
  • 选择列表中的条目时,读取该标志
  • 如果未设置标志,请取消选择该项目
  • 取消设置标志

代码方面,这相当于以下内容(请注意,我不会在现实世界的场景中编写这样的代码,但要了解它的要点,就足够了)

private bool _valueIsSetProgrammatically = false;

private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
    this._valueIsSetProgrammatically = true;
    this.listBox2.SelectedItem = this.listBox1.SelectedItem;
}

private void listBox2_SelectedValueChanged(object sender, EventArgs e)
{
    if (!this._valueIsSetProgrammatically)
    {
        this.listBox2.SelectedItem = null;
    }

    this._valueIsSetProgrammatically = false;
}

请注意,这个 sn-p 取消选择第二个列表框。如果您想保留所选项目,您可以将第二种方法更改为

private void listBox2_SelectedValueChanged(object sender, EventArgs e)
{
    if (!this._valueIsSetProgrammatically)
    {
        this.listBox2.SelectedItem = this.listBox1.SelectedItem;
    }

    this._valueIsSetProgrammatically = false;
}

(从技术上讲,在这种情况下不需要标志,您可以简单地将listBox2SelectedItem 设置为listBox1SelectedItem。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多