2011-11-08 12 views
4

私のアプリケーションでは、アプリケーションの実行中にWpfLocalizationを使用して翻訳を提供します。ライブラリは基本的に、プロパティとその割り当てられたローカライズキーワードのリストを維持し、アクティブ言語が変更されたときに値を更新するのにDependencyObject.SetValue()を使用します。文字列が不思議に切断される

私は自分の問題に気付いたシナリオです:私は単純なTextBlockを持っており、そのTextプロパティにローカライゼーションキーワードを割り当てました。私のアプリケーションが起動すると、初期値が書き込まれ、画面に表示されます。今度は言語を切り替えると、新しい値はTextプロパティに設定されますが、テキストの半分だけが実際に画面に表示されます。言語を前後に切り替えても効果はありません。最初の言語は常に表示され、2番目は切り捨てられます(単語の途中ではあるが、常に完全な文字)。

両言語の相対的な長さは、それとは関係がないようです。私のテストケースでは、動作言語の文字列は498バイトで、切り捨てられた文字列は439バイトで、257バイト後に切り捨てられます。

TextBlockTextプロパティの現在の値を、ローカライズコードで値を変更する直前に調べると、いずれの言語でも常に期待値(切り捨てられない)になります。

WPF Inspectorで実行時にTextBlockを検査すると、カットオフテキストが第2言語のTextプロパティとして表示されます。

これは今まで私にとって意味をなさない。しかし今、それは良くなる。

元のWpfLocalizationライブラリは、標準リソースファイルからローカライズされた文字列を読み取りますが、Excelファイルからこれらの文字列を読み取ることもできる修正バージョンを使用しています。それはOleDbConnectionを開き、Microsoft OLE DBドライバを使用して、その文字列を読み取ることで行います。デバッガでは、すべての値が正しく読み込まれていることがわかります。

今、私は、同僚が「テキストを切り取る」問題の修正を見つけたとき、本当に驚いていました。彼はExcelシートの行を並べ替えました。私はそれがどのように関連しているかわかりませんが、そのファイルの2つのバージョンを切り替えることで、この問題に影響があります。

答えて

5

Excel用のOLE DBドライバは、列にデータのサンプルを取り込んで型に割り当て、文字列にも長さを割り当てる必要があるため、実際には意味があります。 255文字のしきい値以下の値しかサンプリングしない場合は、文字列(255)のタイプと切り詰められたテキストが得られます。長い文字列をサンプリングした場合はメモ欄として割り当て、長い文字列を取得/並べ替えを行うと、どの行がサンプリングされるかが変更されます。

oledbを使用してSQL ServerをExcelに読み込んだ場合、これは既知の問題であることがわかります。 http://msdn.microsoft.com/en-us/library/ms141683.aspx - あなたは同じole dbドライバを使用しているので、私は状況があなたにも当てはまると思います。ドキュメントから

切り捨てられたテキスト。 ドライバがExcelの列 にテキストデータが含まれていると判断した場合、ドライバはサンプリングする最も長い値に基づいてデータ型(文字列またはメモ) を選択します。ドライバが のサンプル行の255文字より長い値を検出しない場合は、の代わりにのメモ欄を255文字の文字列として扱います。したがって、255文字より長い値は、 が切り捨てられます。切り捨てることなくメモ欄からデータをインポートするには、 は、サンプリングされた 行の少なくとも1つのメモ欄に255文字より長い値が含まれていることを確認するか、またはドライバによってサンプリングされた行数を に増やす必要があります。そのような行を含みます。あなたは マイクロソフト\ジェット\ 4.0 \エンジン\ Excelのレジストリキー \ HKEY_LOCAL_MACHINE \ソフトウェアの下で TypeGuessRowsの値を大きくすることにより、サンプリングされた行の数を増やすことができます。詳細については、PRB:Jet 4.0からのデータの転送を参照してください。 OLEDBソースにエラーが発生しました。

+0

今は完璧です。しかし、なぜ私はデバッガで完全な文字列を確認できませんでしたか? –

関連する問題