1

ライトスイッチ Web アプリケーションで c# と VS2012 を使用しています。

データを (検索画面で) CSV にエクスポートしたいのですが、POC に到達できません。

私が理解しているように、2つの主な問題があります.savefiledialogはユーザーボタンから直接発生する必要があり、メインディスパッチャーで発生する必要があります.

私はこのコードを使用しました:

        partial void mySearchScreen_Created()
        {
            var CSVButton = this.FindControl("ExportToCSV");
            CSVButton.ControlAvailable += ExportCSV_ControlAvailable;

        }
        private void ExportCSV_ControlAvailable(object sender, ControlAvailableEventArgs e)
        {
            this.FindControl("ExportToCSV").ControlAvailable -= ExportCSV_ControlAvailable;
            Button Button = (Button)e.Control;
            Button.Click += ExportCSV_Click;
        }

        private void ExportCSV_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            Microsoft.LightSwitch.Details.Client.IScreenCollectionProperty collectionProperty = this.Details.Properties.mySearch;
            var intPageSize = collectionProperty.PageSize;
            //Get the Current PageSize and store to variable
            collectionProperty.PageSize = 0;

            var dialog = new SaveFileDialog();
            dialog.Filter = "CSV (*.csv)|*.csv";
            if (dialog.ShowDialog() == true) {

                using (StreamWriter stream = new StreamWriter(dialog.OpenFile())) {
                    string csv = GetCSV();
                    stream.Write(csv);
                    stream.Close();
                    this.ShowMessageBox("Excel File Created Successfully. NOTE: When you open excel file and if you receive prompt about invalid format then just click yes to continue.", "Excel Export", MessageBoxOption.Ok);
                }
            }
            collectionProperty.PageSize = intPageSize;
            //Reset the Current PageSize
        }

        private string GetCSV()
        {
            StringBuilder csv = new StringBuilder();

            int i = 0;

            foreach (var orderRow_loopVariable in mySearch) {
                var orderRow = orderRow_loopVariable;
                ////HEADER
                if (i == 0) {
                    int c = 0;
                    foreach (var prop_loopVariable in orderRow.Details.Properties.All().OfType<Microsoft.LightSwitch.Details.IEntityStorageProperty>()) {
                        var prop = prop_loopVariable;
                        if (c > 0) {
                            csv.Append(",");//Constants.vbTab
                        }
                        c = c + 1;
                        csv.Append(prop.DisplayName);
                    }
                }
                csv.AppendLine("");

                ////DATA ROWS

                int c1 = 0;
                foreach (var prop_loopVariable in orderRow.Details.Properties.All().OfType<Microsoft.LightSwitch.Details.IEntityStorageProperty>()) {
                    var prop = prop_loopVariable;
                    if (c1 > 0) {
                        csv.Append(",");//Constants.vbTab
                    }
                    c1 = c1 + 1;
                    csv.Append(prop.Value);
                }
                i = i + 1;
            }

            if (csv.Length > 0) {
                return csv.ToString(0, csv.Length - 1);
            } else {
                return "";
            }
        }

これは機能しますが、最初のページ項目しか取得できません。別のことをしなければならなかったので、このコードを使用してその問題を解決しました:

this.DataWorkspace.myDataContextData.MySearch(...).Execute();

「MySearch」を使用する代わりにそれを試してみると、次のエラーが表示されます。

t is not valid to call Execute() on a different Dispatcher than the ExecutableObject's Logic Dispatcher.

データを扱うシステム構築において、データに関する基本的なこと(csv/excelへのエクスポート)が難しいのはなぜですか?

何か案は ?

4

2 に答える 2

0

コードに問題があるとは思いませんが、大規模なコレクションのページ サイズをリセットするのに時間がかかることに気付きました。その間、コードの残りの部分は引き続き実行されます。それが最初のページしか得られない理由だと思います。私が見つけた唯一の解決策は、待つことです。

[ファイルのダウンロード - セキュリティの警告] ダイアログが表示されたら、画面のタブにある [ビジー] インジケータと、グリッドの下部にある [ページ x/y] ステータス (表示されている場合) に注意してください。ビジー インジケータが消え、ステータスが [ページ] になった場合にのみ、[OK] をクリックして続行してください。

私はこれをプログラムで行う方法を考え出していないので、ユーザー数を厳密に管理していない限り、これはあまり役に立たない機能です。しかし、それがあなたと数人のパワー ユーザーだけであれば、実行可能です。これがVS2012以降のバージョンで改善されたかどうかもわかりません。

クエリからページングを完全に取り除くという他の回答には、マイナス面がある可能性があります。グリッドコレクションがモーダルウィンドウに表示されていて、グリッドに行が多すぎるとウィンドウが閉じられなくなったときに、その回避策を試しました。

フィル

于 2015-03-12T12:52:33.467 に答える