4

ReportViewer コントロールにツリー階層として表示されるレポート名のリストがあります。ユーザーがレポート名をクリックすると、入力フォームが読み込まれ、ユーザーはいくつかの値を入力して [OK] を押します。この時点で、バックエンド プロセス (DB への接続、値の取得など) の実行中にスプラッシュ スクリーンが読み込まれます。レポートが Reportviewer エディターに読み込まれると、スプラッシュスクリーンが閉じます。

これまでのところ、スプラッシュ スクリーンを表示することはできますが、その時点で動かなくなり、実際のレポートが読み込まれず、スプラッシュ スクリーンが永久に表示されたままになります。

アプリの起動時ではなく、アプリの途中でスプラッシュスクリーンを使用することはできますか? その場合、レポートの読み込みを続行するにはどうすればよいですか?

static class Program
{
    [STAThread]
    static void Main(string[] args)

    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SnapPlusReports());

        //new SplashScreenApp().Run(args);
    }
}

public class SplashScreenApp : WindowsFormsApplicationBase
{
    private static SplashScreenApp _application;

    public static void Run(Form form)
    {
        _application = new SplashScreenApp { MainForm = form };
        _application.Run(Environment.GetCommandLineArgs());
    }

    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new ShowProgress();
        base.OnCreateSplashScreen();
    }

}
4

2 に答える 2

0

...他のインスタンスをキャッチし、一度にメモリ内にアプリのコピーが1つだけ必要な場合は、正常に終了します

static void Main()
{
    Application.EnableVisualStyles();
    bool exclusive;
    System.Threading.Mutex appMutex = new System.Threading.Mutex(true, "MY_APP", out exclusive);
    if (!exclusive)
    {
         MessageBox.Show("Another instance of xxxx xxxBuilder is already running.","MY_APP",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation );
                    return;
    }
    Application.SetCompatibleTextRenderingDefault(false);
    xxxWindowsApplication.InitializeApplication();
    Application.Run(new frmMenuBuilderMain());
                GC.KeepAlive(appMutex);
            }

メインフォームの読み込みでは、次のようなことができます。

private void frmMenuBuilderMain_Load(object sender, EventArgs e)
{   

     //Show Splash with timeout Here--
     if(!SystemLogin.PerformLogin())             
     {
         this.Close();
         return;
     }
     tmrLoad.Enabled = true;

}

于 2013-02-06T04:18:56.070 に答える
0

コードを使用して実行時に動的に新しいフォームを作成することで、以前にこれを行いました。すべてのオプション、特に FormBorderStyle を none またはそのようなものに設定して、ユーザーがそれを閉じることができないようにしてください。次に、そのフォームに表示されるラベルを操作するだけで、プロセスが完了したらフォームを閉じます。この方法では、スレッド化について心配する必要はありません。また、最初のフォームがクリックできなくなるという良い副作用もあります。

たとえば、実行時にポップアップする about フォームがあります (ただし、何も変更していませんが、アイデアはそこにあります:

AboutForm aboutForm = new AboutForm();
aboutForm.StartPosition = FormStartPosition.CenterParent;
Label lblAbout = new Label();
Version applicationVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
lblAbout.Text = applicationVersion.ToString();
lblAbout.Location = new Point(145,104);
aboutForm.Controls.Add(lblAbout);
aboutForm.ShowDialog();

これは、現在のプログラムのバージョン番号などを示しています。フォームには既に存在する他のラベルがあります (最初に視覚的に作成してから、そのインスタンスを呼び出しました)。

お役に立てれば!

于 2013-02-06T04:07:57.183 に答える