1
Dim ii = _DsAttribute.Tables(0).Rows.Find(Convert.ToString(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value, CultureInfo.CreateSpecificCulture("en-US")))  '.ToString.ToString(CultureInfo.InvariantCulture))
Dim jj = _DsAttribute.Tables(0).Rows.Find(Convert.ToString(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value, CultureInfo.CreateSpecificCulture("en-US"))).Item("Checked")

上記の多くのバリエーションを試し、データベースのデータが私のマシンのデンマーク文化 (Windows の地域/言語設定で設定) によって「破損」しないようにしようとしました。インバリアント カルチャ、fr-FR および en-US を試しました。

私のマシンがデンマーク語の場合、iiは null に等しく、jjは例外を返します (「オブジェクト参照がオブジェクトのインスタンスに設定されていません」)。また、DtgFields.Rows(e.RowIndex).Cells("AttributeID").Valueの値を検索すると、 _DsAttributeのデータで見つけることができます。ID のデータは、少なくとも肉眼では同じです。

この種の問題を回避するために CultureInfo を利用するにはどうすればよいですか?

4

2 に答える 2

2

これは技術的に可能です。デンマーク語では、米国英語とは異なる並べ替え順序が使用されます。アメリカのように電話帳の最後ではなく、デンマークでは Åårdvårk 氏が電話帳の最初に表示されます。

そのため、Find() メソッドが二分探索またはツリーを使用してデータを検索する場合、文字列比較は危険な命題になります。これは確かに DataSet の場合で、そのプライマリ キー インデックスは赤黒ツリーです。うまくいかないのは、インデックスが照合としてデンマーク語で書かれているのに、照合として英語で読み取られた場合、アルゴリズムがツリーを下る間違ったパスをたどるということです。またはその逆です。その結果、ツリー内にエントリが存在するにもかかわらず、エントリを見つけることができません。

反対に、Guid 型の dbase 列は文字列であってはなりませんが、文字列であることは珍しくありません。また、その Guid 値には、検索を誤らせる可能性のある文字を含めるべきではありません。列がクリーンではなく、GUID 以外の値が含まれている可能性があります。列の型を変更するか、同じ照合順序 (つまり、言語) を一貫して使用することで、これを修正します。簡単に修正できるように、CultureInfo.CurrentCulture を試してください。

于 2012-12-04T16:58:29.593 に答える
0
Dim ii = _DsAttribute.Tables(0).Rows.Find(New Guid(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value.ToString))
Dim jj = _DsAttribute.Tables(0).Rows.Find(New Guid(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value.ToString)).Item("Checked")

上記が私にとっての解決策でした。ハンスの回答には、非常に役立つ多くの技術情報が含まれており(したがって、私の賛成票)、私の回答につながりました。

于 2012-12-05T09:35:42.133 に答える