0

私は C++ .net で作業しています。bindingsource を間に挟んで dataBase の内容を表示するカスタム コントロールがあります。コントロールでラベルを使用して、次のコードを使用して bindingsource を介してテキスト プロパティをデータセット内のデータにバインドします。

mycontrol->Controls[i]->DataBindings->Add((gcnew System::Windows::Forms::Binding(L"Text", 
this->bindingSourceRelRev_Data, mycolumn,true, System::Windows::Forms::DataSourceUpdateMode::OnValidation,
nullptr, L"t")));

このコードは、すべてのコントロールを反復するループの抜粋であることに注意してください。つまり、ラベル コントロールになる control[i] と、バインドされるデータセットの列になる変数 mycolumn です。 . 私がまだ変更する方法を見つけていない望ましくない動作を除けば、それはうまく機能します。ソフトウェアは世界のさまざまな地域で実行されますが、記録は現地時間である必要があります。データベースは localtime の時刻を DateTime 値として保存しますが、dataBinding はそれを UTC として解釈し、タイムゾーンの差が適用されたラベルに時刻を表示します。たとえば、データが 24/06/2012 16:40 の場合、4 時間差のタイム ゾーンでは 24/06/2012 22:40 と表示されます。保存されたままの値を変更せずに表示する必要があります。

さまざまな方法を考えることができますが、エレガントではありません: -ラベルのテキスト更新イベントをキャプチャし、変更を元に戻します... -日付を文字列としてDBに保存します... -ラベルを手動で入力します。 .. -...

フォーマットせずにバインドすると、値は変更されませんが、ラベルに生の日時文字列があります...

タイムゾーンを変更する必要がないように、バインドに欠けている魔法はありますか?

事前にどうもありがとうございました!アダン

4

1 に答える 1

0

問題は実際にはバインディングではなく、データセット自体にあったようです。列のプロパティ DateTimeMode が undefinedlocal に設定されていたため、データ入力がシリアル化され、データを表示しているマシンのローカル時間に変換されていました。プロパティを未定義に変更しただけで、変更されていないデータから日付を取得するだけで、希望どおりに機能するようになりました。

日付をシリアル化すると記載されている DateTime のフォーマット プロバイダーに関するドキュメントに戸惑いました。おそらく私はそれを誤解しました...実際にはそうではありません。

とにかくありがとうございました!

于 2012-06-25T10:39:53.697 に答える