gpt4 book ai didi

c# - 取消装箱卡住 Winforms ComboBox

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:57 24 4
gpt4 key购买 nike

这里是一个非常具体和奇怪的问题,谷歌和其他人无法给我答案。

我有一个带有两个组合框的表单,我们会说 A 和 B。在 A 中选择一个项目会从数据库中提取一些信息,将其放入字典中,然后使用 BindingSource 将其放入 B 中。当用户选择某些内容时从 B 开始,返回值已设置,仅此而已。

问题出在 ComboBox B。在其 SelectedIndexChanged 处理程序中,尝试取消装箱其 SelectedItem 会导致 ComboBox“卡住”,因此它不再显示 ListBox B 中新选择的结果,并且长列表在向上滚动时不会刷新/向下。不过,如果您还记得数据的位置,组合框仍然可以使用

B 的 SelectedIndexChanged 处理程序:

private void comboBox2_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (dataSourceSelect)
return;
else
{
ComboBox comboBox = (ComboBox)sender;

var dummy = comboBox2.SelectedItem;
// System.Collections.Generic.KeyValuePair<int, string> dummy2 =
// (System.Collections.Generic.KeyValuePair<int, string>)dummy;
}
}

有两个虚拟变量表明它不是导致问题的 SelectedItem 属性,只是拆箱。

使用这个确切的代码可以让 ComboBox 正常工作,但它无法返回数据。启用注释掉的行可以让它返回值,但会阻止它刷新。

这段代码不会显示两件事:

  1. 即使您放入注释行,在您从 ComboBox A 中进行第二次选择之前一切正常。换句话说,如果您从 ComboBox A 中选择一次,ComboBox B 将根据您的输入刷新。但是,如果 A 中的选择发生更改,B 会卡住显示的最后一个值,并且长列表在滚动时不再更新。

  2. 填充 ComboBox A 和 B 的代码几乎相同,它们的点击处理程序也是如此,但 A 始终可以正常工作,而当您从 A 中进行第二次选择时 B 卡住。

我只能推测其原因,但我的猜测是拆箱使用了一些临时内存位置,该位置讨厌被触摸两次。根据 A 的选择填充 B 的代码也可能存在一些问题,但在取消装箱被注释掉时它工作正常的事实减少了这种怀疑。

据我所知,我需要执行以下操作之一:

  1. 以另一种方式访问​​ SelectedItem
  2. 无需拆箱即可访问 SelectedItem 中的数据
  3. 找到一种完全避免拆箱的方法

为格式化而道歉,StackOverflow 似乎忽略了我试图使其更具可读性的尝试

最佳答案

非常感谢 Thomas Levesque (https://stackoverflow.com/users/98713/thomas-levesque) 建议检查评论中的异常。

由于我想在 A 中进行新选择后将充满不同信息的新字典分配给 ComboBox B,因此我首先将其 B 的 DataSource 设置为 null(在 A 的 SelectedIndexChanged 事件中)。这触发了 B 的 SelectedIndexChanged 事件,它试图访问空列表的 SelectedItem,抛出 NullReferenceError,导致错误和卡住。

有两种方法可以避免这种情况:

  1. 在尝试对值拆箱之前检查 B 的 SelectedItem 是否为 null
  2. 使用其他代码阻止 SelectedIndexChanged 事件访问 B 的 SelectedItem

关于c# - 取消装箱卡住 Winforms ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13094025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com