【问题标题】:Prevent Listbox selection from changing防止列表框选择改变
【发布时间】:2019-01-30 13:28:12
【问题描述】:

我对 C# 和一般编码非常陌生。我有一个关于我的小项目的问题。我有多个连接到我的 SQL 数据库的列表框。在列表框下,我有文本框可以将新值输入到数据库中。

我遇到的问题是,每当我在文本框中输入某些内容时(我这样做了,所以按 Enter 键会运行 Keydown 事件以添加行),我的列表框中的选择会发生变化。这很烦人,因为我选择的内容很重要,因为我加入了多个数据库,而选择决定了输入的去向。

所以我的问题是,在 WPF 或 C# 中有没有办法防止选中的项目被取消选中?我已经搜索了一段时间,但除了我所拥有的小知识无法理解的解释之外找不到任何东西。

编辑

感谢您的回复。我查看了人们发布的链接,但我无法弄清楚它们如何应用于我的确切问题。 我一直在尝试将 SelectedIndex 保存在一个变量中,然后将 SelectedIndex 设置回该变量,但我一定在某处犯了错误。

int y;
        private void TxbSchüler_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                y = listClasses.SelectedIndex; // Here

                try
                {
                    string query = "insert into Schüler values (@Name, @KlassenId)";
                    SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
                    sqlConnection.Open();
                    sqlCommand.Parameters.AddWithValue("@Name", txbSchüler.Text.ToString());
                    sqlCommand.Parameters.AddWithValue("@KlassenId", listClasses.SelectedValue);
                    sqlCommand.ExecuteScalar();

                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.ToString());
                }
                finally
                {

                    sqlConnection.Close();
                    ShowStudent();
                    ShowClass();

                }

            }
            listClasses.SelectedIndex = y; //here

        }

【问题讨论】:

标签: c# wpf


【解决方案1】:

在添加元素之前,将所选索引存储在变量中,并在添加项目后将所选索引设置回该变量

【讨论】:

  • 感谢您的回答。我现在尝试这样做,但我无法使其工作。我用我拥有的代码编辑了帖子,也许你可以看看。
【解决方案2】:

所以,如果没有看到您的其余代码,我很难判断,但是您在 TxbSchüler_KeyDown 方法之外声明了 y。由于这超出了您的方法的范围,这意味着您的类中的其他方法将可以访问此变量,并且能够在您的方法完成执行之前更新其值(这可能是您的问题)。

根据您的代码,y 很有可能在 TxbSchüler_KeyDown 方法之外进行更新。如果这些方法正在更新listClasses.SelectedIndex,我会查看您的ShowStudentShowClass 方法,看看它们是否还使用了一个名为y 的变量,因为它们可能有权访问更新此值,从而有机会更新y,因为ylistClasses.SelectedIndex 绑定。

一般来说,最好将这些变量保留在您的方法中,以避免在您的方法范围之外对该变量进行任何不必要的更改。如果您需要在另一个进程中使用此变量,只需将其作为参数传递给另一个方法或函数。

简而言之,如果您在方法中移动变量 y 的声明,如果您在代码中的其他位置更新 y(通过 listClasses.SelectedIndex 中的更新或直接更新),这可能会解决您的问题更改y)。如果不是,它可能是一个更复杂的控制问题。但是,我对此表示怀疑。

然而,事实上您将选择的索引重新分配为y,只有在您调用两个可以访问change的方法之后strong> 这个变量在重新分配之前是一个很大的危险信号,让我相信这可能是一个与范围相关的问题,它提供了不需要的 y 变量重新分配。

链接:Geeks For Geeks: C# Variable Scope

希望您的解决方法就这么简单。最好的祝愿。

附注- 也可以将其命名为比 y 更好的名称,因为它会在代码中的其他地方像大拇指一样突出。 y 含糊不清且不具描述性。将其命名为 int CurrentIndex

【讨论】:

  • 非常感谢。我不知道为什么,但是将 y 变量移动到方法修复了它。其余代码中没有任何内容更改 y,但由于某种原因它现在可以正常工作,所以我不会抱怨;)谢谢
  • 澄清一下,(我会更新我的答案),如果“y”不在您的方法范围内,但您将其分配给“SelectedIndex”,这意味着任何更新“SelectedIndex”的方法都会更新'y' 在你的方法之外,因为这些方法会改变 'SelectedIndex' 并且 'y' 知道它什么时候因为 'y' 的范围而改变了。当您在方法中移动“y”时,这意味着除非您直接更改该方法中的选定索引,否则“y”不会更新为其他值,因为“y”甚至不存在于其他方法的范围内他们改变'SelectedIndex'。有意义吗?
  • 而且,没问题!很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多