DevExpress (この質問では「DX」と呼びます) コントロール、TextEdit
.
ここに私が持っているもののサンプルがあります
<Grid>
<dxe:TextEdit x:Name="te" MaskType="Numeric" Mask="###,##0.###"
MaskUseAsDisplayFormat="True" Validate="te_Validate"
Text="{Binding myValeur, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
マスクMask="###,##0.###"
は正常です。小数点以下 3 桁までの 9 つの数字に制限されています。
コードビハインドでこれを行います
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
ですが、10 進数のみが格納され100
ます。
私はフランス人で、フランスの文化を使用しているため、「コンマ」は UI の小数点記号ですが、変数は小数点記号の「ポイント」で正しく保存されます。
編集:
このコードをテストすると、同じエラーが発生します。したがって、問題は10進数への変換だと思います。string
小数で値を取得しますが、変換のバグです。
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(".", ","));