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上的某一个控件的相对位置
无论控件如何,在表单上的任何控件更新后有啥方法可以触发事件?