【问题标题】:Selected TextBox deselecting when I change ListBox当我更改列表框时,选定的文本框取消选择
【发布时间】:2016-05-21 18:29:23
【问题描述】:

我正在让自己成为项目经理,我需要经常刷新项目列表。当我刷新项目管理器时,我想选择之前选择的项目。但是该选择导致我的文本框取消选择,因此,发生的情况是该文本框在键入一个键后取消选择。

所以概述会发生什么:

  • 我尝试编辑一个文本框
  • 版本导致项目更新 -> 程序调用 RefreshProjectList()
  • RefreshProjectList() 在标记位置上会导致选定的文本框取消选择
  • 结果:写一个符号后必须选择文本框

Picture if useful

These selected text boxes are struggling to be edited

代码:

    private void RefreshProjectList() {
        if (BlockListReload)
            return;

        Project selected = (Project)ProjectList.SelectedItem;
        ProjectList.Items.Clear();
        CurrentlyShown.Clear();

        foreach(Project p in Projects){
            if (p.state == State.Planned && ShowPlanned.Checked) {
                CurrentlyShown.Add(p);
                ProjectList.Items.Add(p);
            }
            if (p.state == State.Active && ShowActive.Checked) {
                CurrentlyShown.Add(p);
                ProjectList.Items.Add(p);
            }
            if (p.state == State.Finished && ShowFinished.Checked) {
                CurrentlyShown.Add(p);
                ProjectList.Items.Add(p);
            }
            if (p.state == State.Delayed && ShowDelayed.Checked) {
                CurrentlyShown.Add(p);
                ProjectList.Items.Add(p);
            }
        }

        if (selected == null)
            return;

        if (ProjectList.Items.Contains(selected)) {
            ProjectList.SelectedItem = selected; // IF I REMOVE THIS
        } else {
            if (ProjectList.Items.Count > 0)
                ProjectList.SelectedIndex = 0; // OR THIS LINE, EVERYTHING WORKS
        }
    }

如果您需要更多代码,我很乐意提供,但我不想向您发送大量无用代码的垃圾邮件。

问:为什么更改ListBox中的选中项会导致TextBox被取消选中,如何防止?

【问题讨论】:

  • 我认为显示的代码中没有错误。我认为您正在以某种方式创建表单的新实例,该实例正在重新初始化整个表单。
  • @jdweng 我确信问题是由那些标记为 (//HERE) 的行引起的,因为如果我将这些行注释掉,一切正常。 (除了 ListBox 没有保留它的选择,这就是我这样做的原因)
  • HideSelection 开启了吗?
  • 什么是CurrentlyShown?您的代码似乎仅适用于 ProjectList(我假设右侧的 ListView)并在 CurrentShown 上调用 Clear 和 Add:我会检查这些方法:也许您正在将选择移到那里
  • @TaW 设置为真。

标签: c# winforms windows-forms-designer


【解决方案1】:

一些具有可选文本或项目的控件还带有属性HideSelection

这包括:

  • TextBox
  • RichTextBox
  • ListView

但不是

  • ListBox
  • CheckedListBox
  • DataGridView

不管你喜不喜欢,它总是默认为true,所以只要焦点离开控件,选择就会被隐藏..

只需在设计器中将其设置为false,无论焦点在哪里,您都可以看到所有选择..

【讨论】:

  • 问题不在于我没有看到选择,问题在于如果我尝试在这些文本框中的任何一个中写一些东西,我在代码中标记的那两行会导致取消选择文本框。因此,如果我想在其中写更长的内容,则每次写完符号后都必须单击它们。
  • 嗯,我不知道你说的“写更长的东西”或“写一个符号”是什么意思;但只要 HideSelection 为真,在将焦点移到文本框之前,您都看不到选择;如果您通过单击选择当然就真的消失了。首先设置 HideSelection=false,然后可能添加一个测试按钮,报告其中一个框的 SelectedText。如果它真的是空的,那么 go 确实有一个 second 问题。请先修复第一个,不过..!
  • 我的错,我永远无法解释事情,希望我现在能解释。通常,您可以毫无问题地在文本框中写入任意数量的字符。但是我的情况是,您在文本框中写了一个字符,并且由于这两行标记了文本框取消选择,所以您不能再在其中写了。因此,我最终会遇到每次输入字符时都必须选择该文本框的情况。
【解决方案2】:

天哪。老实说,我不知道为什么我没有看到它。

ProjectList.SelectedItem = selected;
//where ProjectList is ListBox<Project> and selected is Project

我在 ProjectList(ListBox) 中选择一个项目。我没有意识到它正在调用 ProjectList_SelectedIndexChanged() 事件。

编辑:通过添加以下内容解决:

        if (focused != null) {
            this.ActiveControl = focused;
            focused.Select(focused.TextLength,0);
        }

重点是我设置为最后选择的文本框的文本框,这是表单。
谢谢 TaW。

【讨论】:

  • 如果一切都解决了,你应该决定你是否有一个已回答的问题,这对其他人有用,或者问题是否只是一个错字等。在后一种情况下,它应该关闭并最终从 SO 中删除。如果您的问题没有全部解决,这不是答案,您应该编辑问题。无论如何:在 ListBox 中选择一个项目将不会删除任何内容。除非您有实现该效果的代码,否则可能在 selectedindexchanged 或 selectedvaluechanged 事件中......
  • @TaW 添加了解决方案,我还是不知道为什么会这样,但是我手动选择了之前选择的 TextBox。
  • 如果你快乐,对你有好处。但是,请注意区分 FocusSelection。当您单击(或按标签)其他地方时,TextBox 丢失了 focus,但它既没有丢失它的 TextSelection(只是 hidden)也没有丢失它自己'失去选择”,因为正在运行的程序中的控件无法无论如何选择,只是聚焦
  • @TaW 它实际上在事件中,我完全没有意识到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多