4

我有一个报表名称列表,在 ReportViewer 控件中显示为树层次结构。当用户单击报告名称时,会加载一个输入表单,用户输入一些值并按 OK。此时,启动屏幕应该在后端进程发生时加载(连接到数据库、检索值等)。在 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

...如果您在给定时间只需要一份应用程序副本在内存中,则捕获其他实例并优雅退出

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 为无,或类似的设置,以便用户无法关闭它。然后简单地操作出现在该表单上的标签,并在您的过程完成后最终将其关闭。这样您就不必担心线程问题,而且一个不错的副作用是初始表单不可点击。

例如,我有一个在运行时弹出的关于表单(当然我没有更改任何内容,但想法就在那里:

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 回答