1

背景: データベースから多数の asp.net c# GridViews と ListViews を作成しています。その後、ユーザーはそれらを Excel にエクスポートできます。ネイティブの Excel (html ではなく) としてエクスポートしたい。オフィス オートメーションを使用できません。問題なく動作する JET を使用しています。私はユーザーのマシンを制御できません。


質問: エクスポートを行うとき、Jet に各フィールドの型を伝える必要があります。私の場合は、"text" (varchar) または "numeric" (double) です。違いは、数値列をエクスポートする場合、ユーザーは Excel でデータを合計できることです。一方、文字列は先頭にアポストロフィを付けてエクスポートされるため、算術ではあまり使用されません。

現在、Grid/ListView の最初のデータ行を解析し、各値が数値かテキストかを確認し、それに応じて列に型を割り当てます。最初の列に数値のように見えるが実際にはテキスト文字列である場合を除いて、これは機能します。これらのエクスポートの一部は非常に大きいため、正しいデータ型を持っていることを確認するために、すべての行を解析したくありません。

データベースから Grid/ListView をロードすると、データベースは各フィールドの型を確実に認識します。だから私の質問は... Grid/ListViewアイテムの背後にあるデータベースアイテムのタイプを抽出するにはどうすればよいですか? 項目の属性として明示的にコーディングすることもできますが、それは、取得できる場合に限り、既に持っている情報と重複しています。

DataTable がある場所から基になる型を取得できることはわかっていますが、ほとんどの場合、便利なテーブルはなく、Grid/ListView だけです。

-- (編集) 空文字列を null 可能な数値列に挿入しようとすると、Jet がスローすることに注意してください。これを行う方法は、挿入ステートメントからその列名を省略するか、ゼロを出力することです。

4

2 に答える 2

0

あなたがしようとしているDataSourceのは、GridViewまたはListViewそれがバインドされた後の根底にあるものを理解することだと思いますか?

DataSourceその場合、コントロールはバインドされた後を実際に追跡しないため、それは不可能です。それらは主にその列、テンプレートなどを埋めるために使用され、それらのアイテムだけが維持されます。

DataSource私が提供できる唯一の推奨事項は、後でアクセスできるように別の場所に保存し、それを使用して各列に使用される基になるデータ型を検出することです。Sessionまたは 必要に応じて格納できViewStateますが、これによりオーバーヘッドが追加されます。もう 1 つのオプションは、バインドする前にデータ型を把握し、後で実行されていたことを複製するために後で使用できる何らかの形式で非表示フィールドに格納することです。

例(悪い例ですが、アイデアを提供します)隠しフィールドに次のデータを保存します。

yourHiddenField.Text = "0,1|1,1|2,0|3,1|etc...";
// format "columnindex,fieldtype(0=double,1=string)" with a pipe delimiter.

きれいではありませんが、私が考えている基本的なアイデアを示しています。

于 2010-08-18T18:40:48.837 に答える
0

私の知る限り、答えは「できません」です。私のデータ ソースは文字列のみを返すため、自動作成された DataTable を列の型に対して有効に解析することはできません。


私がしたことは...

グリッド/リストの最初の行を見て、ほとんどの列タイプを「嗅ぎ分ける」ことができます。これは、最初の列のデータが null の場合 (何も表示されない)、または 1 番目の列が数値を意味するが、列のデータがたとえば英数字の場合にのみ失敗します。

したがって、問題があることがわかっている列、またはテストで問題があることがわかっている列については、それらの特定の Grid または ListView 項目にカスタム属性で注釈を付けて、項目を強制的にテキストまたは数値としてエクスポートします。私はデフォルトでテキストを使用するので、実際には、特に数値としてレンダリングしたいエントリに注釈を付けるだけで済みます。例外は、先行ゼロで始まる ID 番号です。そのようにレンダリングしたいので、明示的にテキストとして表示します。

DataTable (チャート用など) があり、スニッフィング トリック (上記参照) または注釈トリック (同上) を実行できない場合は、列タイプのマップをエクスポート コードに渡します。

要約すると、場合によっては、Grid/ListView テンプレート フィールドまたはフィールド マップで列タイプの定義を繰り返さなければならないことがあります。それらすべてに勝つことはできません。それは機能します。

于 2010-08-20T20:51:53.523 に答える