Windows桌面应用中点击时NumericUpDown重置为最小值问题
问题解决:EditingListView中NumericUpDown点击后显示0.00而非预期数值
问题描述
在Windows桌面应用的EditingListView列中嵌入NumericUpDown控件后,ListView单元格以文本形式显示十进制数值,但点击单元格进入编辑状态时,NumericUpDown始终显示"0.00",而非单元格原本的数值。
原代码(带中文注释)
// 在构造函数中设置可编辑列 lvUpdates.SetEditableColumn(FinalizeAmountColumn, EditingListViewEditType.NumericUpDown); // 事件处理方法 private void lvUpdates_ControlShowing(object sender, CancelEditingListViewEventArgs e) { var lvi = (PropertyListViewItem)lvUpdates.Items[e.Row]; if (lvi == null) return; var info = (DebtSetOffMatchUpdateInformation)lvi.Tag; // 如果匹配金额<=0或记录类型不是Finalize,则取消编辑 if (info.MatchAmount <= 0 || info.RecordType != DebtSetOffMatchUpdateInformation.RecordTypes.Finalize) { e.Cancel = true; return; } // 针对FinalizeAmount列的NumericUpDown控件进行设置 if (e.Column == FinalizeAmountColumn && e.Control is NumericUpDown nud) { nud.Minimum = 0; nud.Maximum = info.MatchAmount; nud.DecimalPlaces = 2; // 获取单元格文本值 var sValue = lvi.SubItems[FinalizeAmountColumn].Text; // 如果文本为空则设为0.00 if (!sValue.HasValue()) sValue = "0.00"; // 解析数值并设置给NumericUpDown nud.Value = decimal.Parse(sValue, NumberStyles.Any); nud.Text = sValue; nud.Refresh(); } }
可能的问题原因及修复方案
1. 单元格文本获取错误
先确认lvi.SubItems[FinalizeAmountColumn].Text是否真的取到了正确的数值文本,可添加调试输出验证:
var sValue = lvi.SubItems[FinalizeAmountColumn].Text; Debug.WriteLine($"获取到的单元格文本:{sValue}"); // 输出到调试窗口查看内容
如果输出为空或非预期数值,需要检查ListView的数据源绑定或单元格文本赋值逻辑,确保SubItems[FinalizeAmountColumn]的Text属性正确设置。
2. HasValue()方法判断逻辑异常
自定义的HasValue()方法可能误判有效数值文本为空,替换为标准字符串空值判断:
// 替换原判断逻辑 if (string.IsNullOrWhiteSpace(sValue)) sValue = "0.00";
3. 数值解析的文化格式冲突
如果单元格文本使用了非当前线程默认的文化格式(比如欧洲地区用逗号作为小数点),decimal.Parse可能解析失败导致值被设为0。改用TryParse并指定不变文化格式:
if (decimal.TryParse(sValue, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal parsedValue)) { nud.Value = parsedValue; } else { nud.Value = 0.00m; }
4. 控件值被后续事件覆盖
部分EditingListView控件会在ControlShowing事件后自动重置编辑控件的值,导致手动设置的nud.Value被覆盖。可通过BeginInvoke延迟设置:
nud.BeginInvoke(new Action(() => { nud.Value = decimal.Parse(sValue, NumberStyles.Any, CultureInfo.InvariantCulture); }));
5. 直接从数据源取值避免文本中转
跳过单元格文本解析步骤,直接从绑定的数据源获取数值:
// 直接从Tag中的info对象读取数值(需确保该值与单元格显示一致) nud.Value = info.MatchAmount;
内容的提问来源于stack exchange,提问作者MubarakZade
相关产品推荐
相关产品推荐

