1

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(".", ","));
4

2 に答える 2

1

既定でen-USは、システム設定に関係なく、WPF はカルチャとして使用します。この動作をオーバーライドしていないと思います。さらに、TextEdit.Mask に小数点記号として「ドット」を含めました。ここまでは順調ですね。100.23これは、値として (「ドット」小数点区切り記号付き) を受け取ったためです。ただし、10 進変換では現在のカルチャ ( French)IFormatProviderが使用されるため、このカルチャを使用してテキストを 10 進値に変換することはできません (これが例外の理由です)。

例外を回避するには、変換に正しいカルチャを指定してください ( の代わりに InvariantCulture を使用できますen-US)。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);
于 2013-03-19T08:40:33.987 に答える
0

いろいろ調べた結果、2つの問題があることが判明しました。

まず、TextEdit によって変更された変数に対して TextEdit のバインドが行われ、奇妙なループが発生し、10 進数を入力するバグが発生しました。

第二に、アプリケーションがフランス文化で定義されている場合でもString.Replace (".", "")、変換を適切に実行するために強制する必要があります。

于 2013-03-20T14:07:38.470 に答える