在文本框显示ListBox选中项值并求平均值,遇计算异常求助
ListBox选中项计算总和异常的解决方法
你的问题根源很明确:执行代码前没有清空TextBox2的原有内容。每次运行这段逻辑时,TextBox2会保留上一次操作的文本,新选中的项目内容会直接追加到旧内容后面,导致看起来像是选中了更多项目,总和自然出错。比如第一次选1个项目后TextBox2里是"5+",第二次选2个项目就会变成"5+3+7+",计算时就会把之前的5也算进去。
下面是修正后的完整代码,同时实现「显示选中项」「计算总和」「计算平均值」的需求:
// 先清空控件原有内容,避免数据残留 Label1.Text = ""; TextBox2.Text = ""; // 初始化总和与选中数量变量 decimal totalSum = 0; int selectedItemCount = ListBox2.SelectedItems.Count; // 遍历所有选中项 foreach (var selectedItem in ListBox2.SelectedItems) { // 将选中项转换为数值,避免非数值内容报错 if (decimal.TryParse(selectedItem.ToString(), out decimal itemValue)) { totalSum += itemValue; // 在Label中拼接选中项文本 Label1.Text += selectedItem.ToString() + ","; // 在TextBox中拼接计算式 TextBox2.Text += itemValue.ToString() + "+"; } } // 处理选中项不为空的情况 if (selectedItemCount > 0) { // 移除计算式末尾多余的"+",并添加总和与平均值 string calculationText = TextBox2.Text.TrimEnd('+'); decimal average = totalSum / selectedItemCount; TextBox2.Text = $"{calculationText} = {totalSum} | 平均值: {average:F2}"; // 移除Label末尾多余的"," Label1.Text = Label1.Text.TrimEnd(','); } else { // 无选中项时的提示 TextBox2.Text = "未选中任何项目"; Label1.Text = ""; }
关键修复点
- 每次执行逻辑前强制清空Label1和TextBox2,彻底避免旧数据干扰
- 用
SelectedItems直接遍历选中项,比通过索引获取更简洁,减少索引操作的潜在错误 - 加入
TryParse做数值校验,防止ListBox中存在非数值项导致程序崩溃 - 处理了无选中项的边界情况,避免出现除以0的异常
- 自动移除拼接字符串末尾多余的符号,让显示内容更规范
内容的提问来源于stack exchange,提问作者Afreen
相关产品推荐
相关产品推荐

