You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:05:02