DevExpress'TextEdit 控件上的 FormatException 无法存储我的十进制值

Posted

技术标签:

【中文标题】DevExpress\'TextEdit 控件上的 FormatException 无法存储我的十进制值【英文标题】:FormatException on DevExpress' TextEdit control that can't store my decimal valueDevExpress'TextEdit 控件上的 FormatException 无法存储我的十进制值 【发布时间】:2013-03-18 13:43:36 【问题描述】:

我有一个 DevExpress(对于这个问题,我将其称为“DX”)控件,TextEdit

这是我所拥有的样本

<Grid>
    <dxe:TextEdit x:Name="te" MaskType="Numeric" Mask="###,##0.###"
                  MaskUseAsDisplayFormat="True" Validate="te_Validate"
                  Text="Binding myValeur, UpdateSourceTrigger=PropertyChanged"/>
</Grid>

MaskMask="###,##0.###" 是正常的,我限制为 9 个数字和 3 个小数。

我在我的代码隐藏中这样做

decimal myDecimalValue = 0.0m;
private void te_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)

    Thread Thread_te_Validate = new Thread(delegate()
    
        this.Dispatcher.BeginInvoke(new Action(delegate()
        
            if (!String.IsNullOrEmpty(te.Text))
                myDecimalValue = Convert.ToDecimal(te.Text);
        ));
    );
    Thread_te_Validate.IsBackground = true;
    Thread_te_Validate.Start();

这段代码有一个奇怪的问题。如果我在我的 TextEdit 中写 100,则该值被正确转换。如果我写100.123(所以我放了一些小数),应用程序崩溃并出现错误FormatException was unhandled by user code (法语翻译)

详细的我有"The format of the input string is incorrect."

崩溃时 TextEdit.Text 的值很好 100.123 但小数只存储 100

我是法国人,使用法国文化,所以“逗号”是 UI 的小数分隔符,但变量正确存储,小数点分隔符中有一个“点”。

编辑: 我测试了这段代码,同样的错误正在发生。所以我认为问题在于转换为十进制。 string 获取的值是小数但有转换bug。

if (!String.IsNullOrEmpty(te.Text))
 
    string test1 = te.Text;
    myDecimalValue = Convert.ToDecimal(test1);

编辑 2: 这段代码也不行。

if (!String.IsNullOrEmpty(te.Text))
 
    string test1 = te.Text;
    myDecimalValue = decimal.Parse(test1);

编辑 3: 我还尝试在转换过程中强制培养文化。 使用此代码,我无法在 TextEdit 中插入小数,只能插入整数。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);

我的特定文化发送FormatException 错误。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

我的中性文化也会发送FormatException 错误。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.CreateSpecificCulture("fr"));

适合我的解决方案: 这段代码对我有用。我在 App.xaml 中的“fr”处定义了我的语言,但显然这还不够。所以问题实际上是文化,当然还有十进制字符。

对我来说,我需要用“逗号”替换“点”,因为 DevExpress 中的文化向我展示了良好的文化,但存储在美国文化中。

if (!String.IsNullOrEmpty(myDXTextEdit.Text))
    myDecimalValue = Convert.ToDecimal(myDXTextEdit.Text.Replace(".", ","));

【问题讨论】:

我遇到了TextEdit.Text 属性的问题。您是否尝试过使用 EditValue 属性? 谢谢,我试过了,结果一样。值完全相同。 【参考方案1】:

默认情况下,WPF 使用en-US 作为文化,无论系统设置如何。我相信您没有覆盖此行为,而且您已将“点”作为小数点分隔符包含在 TextEdit.Mask 中。到现在为止还挺好。那是因为您收到了100.23(带有“点”小数分隔符)作为值。但是,十进制转换使用您当前的文化(即French)作为IFormatProvider,因此您不能使用这种文化将文本转换为十进制值(这是异常的原因)。

为避免异常,请指定正确的文化进行转换(您可以使用 InvariantCulture 代替en-US):

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);

【讨论】:

感谢 DmitryG,但我已经对其进行了测试,但无法正常工作。如果设置了InvarientCulture,我无法在 TextEdit 中写入十进制值。我会测试修改TextEdit的Mask来试试。 感谢“定位”我的问题,原因是文化 @Saesee 我很高兴听到问题已解决。您能否用最终解决方案更新您的问题? 我添加了它。我希望这可以帮助其他人。【参考方案2】:

经过大量研究,发现有两个问题。

首先,TextEdit 的绑定是在 TextEdit 修改的变量上进行的,这会产生奇怪的循环和输入小数的错误。

其次,即使我的应用程序是在法国文化中定义的,它仍然必须强制 String.Replace (".", "") 才能正确执行转换。

【讨论】:

以上是关于DevExpress'TextEdit 控件上的 FormatException 无法存储我的十进制值的主要内容,如果未能解决你的问题,请参考以下文章

获取屏幕上的某个控件相对位置,尤其是tableviewcell上的某一个控件的相对位置

MFC如何获取控件在对话框上的位置坐标

如何从 viewmodel 访问用户控件上的命令

无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?

实际操作-手把手探究tableViewCell上的控件点击事件

自定义滑块控件上的 UIAccessibility