被组合框的索引快弄疯了!为啥不能设置为0??

清风明月逍遥云 2019-07-16 06:33:24
我做了个与下位机通讯的小程序,本来以为成功了,但有个小问题又弄疯了我。
我有2个台式机和1个笔记本,装的都是win7 64位系统。 2个台式机都装了VS2019(.Net Framework 4.7.2),但笔记本没装VS2019,不过不知啥时候装了.Net Framework 4.7.1。我是在台式机1上写C#程序的,调试都成功了,然后将bin-Releae文件夹里的EXE文件复制到台式机2上,能够正常运行;然而,用同样方式复制到笔记本上,却有如下出错提示:

说的是组合框的索引不能为0?这一下子勾起了我前几天的伤心往事:
我这个软件界面里放了两个组合框,名字分别为selectCom(用于选择电脑的串口)和adjustNum(用于选择下位机的数量,我希望是1-10台)。那么在窗体的加载程序里,我有权初始化这两个组合框的索引吧?语句分别为:
selectCom.SelectedIndex = 0; //串口选项默认为第一项
adjustNum.SelectedIndex = 0; //下位机数量默认为1台
然而,虽然编译成功(顺便问下,菜单栏的“生成解决方案 F6”就是编译吧?),但运行“开始执行不调试”时,却弹出了如下错误:

我几经折腾,发现,是adjustNum.SelectedIndex = 0这句的问题!将之注释掉,则完全正常!可是,选择串口的那个组合框的初始化语句怎么就没问题呢?我折腾好久也没解决,为了不耽误后续工作,我只好将那个语句注释掉了(这也导致我的程序运行后,数量选择组合框里是空白的,而我希望是能显示“1”的)。终于调试完整个程序,我都忘了这码事,就准备放到笔记本上运行,结果就出现前面说的现象了!看来,这个问题还没解决,我简单地注释掉那句程序是掩耳盗铃!到底怎么回事?两个组合框,在界面里设置的属性都是一样的,在程序里的初始化语句也是一样的,但为啥一个没事另一个有事呢?????
最后给我的程序截图,大家可能会更清晰我的问题:

...全文
301 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[quote=引用 8 楼 上帝的亲哥哥 的回复:] 粘一下我的代码过去: 厉害!我把你的下半部分的代码复制过去,就成功了!截图一下: 这是怎么回事?组合框居然也能象表格一样,挂上一个数据源? 但我原先那段程序是怎么回事? 明天到单位到笔记本上看看效果。
  • 打赏
  • 举报
回复
引用 14 楼 f**kcsdn 的回复:
单独执行这个是没问题的,所以还是要看你程序的上下文,包括一些事件里是否对这个下拉框有过操作 而且Add操作是会触发SelectedIndexChanged事件的,所以如果你这个下拉框有这个事件,也要注意排查一下
啊!还有这一说! 我确实用到了SelectedIndexChanged事件,怪不得经常发生莫名其妙的问题!谢谢谢谢!我仔细检查处理一下。Add居然会触发这个事件,我以为只有鼠标才会触发此事件呢!!!
csdnFUCKINGSUCKS 2019-07-17
  • 打赏
  • 举报
回复
引用 13 楼 清风明月逍遥云 的回复:
[quote=引用 12 楼 zj_zwl 的回复:] 不能设置为0,肯定是items项目数为空
然而你看我的程序,我是有给组合框的items赋值1-10的 int k; for (k = 1; k <= 10; k++) { adjustNum.Items.Add(k.ToString()); //给组合框添加下位机数量 }[/quote] 单独执行这个是没问题的,所以还是要看你程序的上下文,包括一些事件里是否对这个下拉框有过操作 而且Add操作是会触发SelectedIndexChanged事件的,所以如果你这个下拉框有这个事件,也要注意排查一下
  • 打赏
  • 举报
回复
引用 12 楼 zj_zwl 的回复:
不能设置为0,肯定是items项目数为空
然而你看我的程序,我是有给组合框的items赋值1-10的 int k; for (k = 1; k <= 10; k++) { adjustNum.Items.Add(k.ToString()); //给组合框添加下位机数量 }
zj_zwl 2019-07-17
  • 打赏
  • 举报
回复
不能设置为0,肯定是items项目数为空
XBodhi. 2019-07-17
  • 打赏
  • 举报
回复
他又一个 Databinding 事件,查看他的执行顺序你就知道了
  • 打赏
  • 举报
回复
[quote=引用 8 楼 上帝的亲哥哥 的回复:] 粘一下我的代码过去: OK 我理解一下你的代码 大致明白你的意思了 我试试看
上帝的亲哥哥 2019-07-16
  • 打赏
  • 举报
回复
粘一下我的代码过去:

private void Form1_Load(object sender, EventArgs e)
{
string[] ArryPort = SerialPort.GetPortNames();

for (int i = 0; i < ArryPort.Length; i++)
{
selectCom.Items.Add(ArryPort[i]);
}

if (ArryPort.Length > 0)
{
selectCom.SelectedIndex = 0;
}
else
{
MessageBox.Show("当前系统无任何可用串口");
}

List<int> list = new List<int>();
for (int k = 1; k <= 10; k++)
{
list.Add(k);
}

adjustNum.DataSource = list;
}
  • 打赏
  • 举报
回复
我好好琢磨你的话 需要时间消化 我刚学C#不久 [quote=引用 6 楼 上帝的亲哥哥 的回复:] 还有,基于串口的编程代码不这么写
上帝的亲哥哥 2019-07-16
  • 打赏
  • 举报
回复
还有,基于串口的编程代码不这么写,如果你不愿写异步,可以使用通用的串口辅助类进行编写,你程序设计中没有进行条件封装,在调用SelectedIndex=赋值前,一定要判断得到的集合数量是否为空,才能赋SelectedIndex=0,程序需要严谨,还有对跨线程进行线程安全处理,留下了太多可能,像你事件中接收到数据,需要更新UI时,应该进行一次判断,通过Delegate的方式在UI上进行指针回调,一般这样写

private void UpdateUIText(string strInfo)
{
if(txtBox1.InvokeRequired)
{

Action<string> _handler = new Action(UpdateUIText);;
txtBox1.Invoke(_handler,strInfo)
}
else
{
txtBox1.Text=strInfo;
}
  • 打赏
  • 举报
回复
引用 3 楼 上帝的亲哥哥 的回复:
其实不是程序的错误,因为台式机是自带一个串口的,所以你设置选择第一个串不会报错,笔记本如果没有安装过虚拟串口类驱动,是没有串口的,所以集合为Count为0,所以就报那个错误了
貌似你说的有理 很符合逻辑 但是,先把笔记本的问题放一边,你观察一下我的程序,那条赋值语句怎么就错了? 刚刚我发现把它往下挪几行,就行了! 郁闷啊!
  • 打赏
  • 举报
回复
引用 2 楼 XBodhi. 的回复:
可以设置 0 的。
我发现,把那句程序放到窗体加载程序的另一个地方,居然就没问题了。纳闷啊。
上帝的亲哥哥 2019-07-16
  • 打赏
  • 举报
回复
其实不是程序的错误,因为台式机是自带一个串口的,所以你设置选择第一个串不会报错,笔记本如果没有安装过虚拟串口类驱动,是没有串口的,所以集合为Count为0,所以就报那个错误了
XBodhi. 2019-07-16
  • 打赏
  • 举报
回复
可以设置 0 的。
  • 打赏
  • 举报
回复
似乎曾经也有这样问题,给控件赋值似乎要滞后一些,设置属性要判断一下并使用异步执行。试看

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧