You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataGridView完全加载后显示Windows窗体:启动屏及加载顺序咨询

关于启动屏的必要性

如果你的数据加载确实需要1-2秒以上的时间,非常建议使用启动屏——用户看不到任何反馈的等待很容易让他们误以为程序卡死了,一个简洁的启动屏(比如显示“正在加载数据,请稍候”)能有效降低用户的焦虑感。如果加载耗时很短(几百毫秒级),那启动屏反而有点多余,直接加载就行。

正确的加载顺序与实现思路

你当前在Form1_Load里同步加载数据的方式会导致窗体迟迟无法显示,用户体验很差。正确的做法是异步加载数据+启动屏配合,核心是不让UI线程被数据加载阻塞,同时给用户明确的加载反馈。

具体步骤可以这样做:

  1. 先显示启动屏:程序启动时,立刻弹出一个简单的启动屏窗体(不需要复杂控件,干净的加载提示就好)。
  2. 后台异步加载数据:把数据库查询、数据获取的逻辑放到后台线程里执行,避免卡住UI线程。
  3. 加载完成后切换界面:数据加载完毕后,关闭启动屏,把数据绑定到DataGridView,再显示主窗体(或者如果主窗体已经初始化完成,直接让它显示出来)。

给你两个常用的实现示例:

示例1:在Program.cs中控制启动流程

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 启动并显示启动屏
    var splashForm = new SplashScreen();
    splashForm.Show();

    // 后台线程加载数据
    Task.Run(() =>
    {
        // 这里写你的数据加载逻辑,比如从数据库获取两个DataTable
        DataTable table1 = GetDataFromDB("SELECT * FROM Table1");
        DataTable table2 = GetDataFromDB("SELECT * FROM Table2");

        // 回到UI线程,关闭启动屏并显示主窗体
        Application.Current.Invoke(() =>
        {
            splashForm.Close();
            var mainForm = new Form1(table1, table2);
            mainForm.Show();
        });
    });

    Application.Run();
}

主窗体通过构造函数接收加载好的数据,直接绑定:

public Form1(DataTable dt1, DataTable dt2)
{
    InitializeComponent();
    dataGridView1.DataSource = dt1;
    dataGridView2.DataSource = dt2;
}

示例2:在主窗体的Load事件中异步加载

private async void Form1_Load(object sender, EventArgs e)
{
    // 先显示启动屏
    var splashForm = new SplashScreen();
    splashForm.Show();

    try
    {
        // 异步执行数据加载,不会阻塞UI
        DataTable table1 = await Task.Run(() => GetDataFromDB("SELECT * FROM Table1"));
        DataTable table2 = await Task.Run(() => GetDataFromDB("SELECT * FROM Table2"));

        // 绑定数据到DataGridView(这一步在UI线程执行,没问题)
        dataGridView1.DataSource = table1;
        dataGridView2.DataSource = table2;
    }
    finally
    {
        // 不管加载成功还是失败,都关闭启动屏
        splashForm.Close();
        // 如果加载失败,可以在这里给用户提示
    }
}

关键注意点

  • 永远不要在UI线程里执行耗时的数据库操作,否则会导致窗体无响应。
  • 数据绑定必须在UI线程进行,上面示例里的Invoke和async/await都会自动帮你切回UI线程,避免跨线程操作控件的异常。
  • 如果加载过程中可能出现错误,记得加异常处理,在启动屏上提示用户或者关闭启动屏后显示错误信息。

内容的提问来源于stack exchange,提问作者Stephan S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:07:33