C#求一个DATAGRIDVIEW数据加载时,显示加载中的解决方案

时间:2022-08-29 14:15:20
C#中,新建一个方案,有两个FORM,第一个FORM里面主要是一个DATAGRIDVIEW控件,用于从数据库绑定加载数据。
第二个FORM,主要是一个动态图片,显示加载中。
想要实现的结果是:点开第一个页面时,准备从数据库获取数据绑定,这时先弹出第二个FORM,显示数据加载中,然后第一个FORM在后台或者其他进程中加载数据,当DATAGRIDVIEW数据加载完成后,关闭掉第二个FORM。
求这样一个方案,最好有代码实现,感谢。

主要过程如下代码所示:
private void frm1_load(object sender, EventArgs e)
            {
                //弹出FORM2 ,显示加载中
             Form frm2 = new Form();
             frm2.ShowDialog();
                //FORM1 后台进行数据加载
             LoadData(frm1.dataGridView1);
                //加载完成后关闭FORM2
             frm2.Close();
            }

7 个解决方案

#1


可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。

#2


frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide

#3


引用 1 楼 xuggzu 的回复:
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。


由于FORM2 里面主要是包含一张动态图,显示数据加载中,不让界面FORM1呈现假死状态,同时让用户等待后续操作。如果用SHOW的话,动图显示不出来。 我之前也是用的SHOW,就是因为显示不出来动图,才改为ShowDialog的。

#4


引用 2 楼 caozhy 的回复:
frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide

版主说的主界面加载完,这里如何判断的?

#5


引用 1 楼 xuggzu 的回复:
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。

我用你这种方法测试了,是可以实现,但是有个问题,FORM2 只是闪现就没有了,大数据加载界面也会出现假死的情况。
看来这种方法实现难度比较大。 我把FORM2 去掉,在FORM1上加一个PritureBox,放上动图。 平时隐藏,加载数据的时候显示出来,这样也可以实现。
主要代码如下:
private void tsBtnLoad_Click(object sender, EventArgs e)
        {
            this.pictureBox1.Visible = true;
            this.dataGridView1.DataSource = null;
            //建立委托
            MyDelegate myDelegate = new MyDelegate(LoadData);
            //异步调用委托,获取计算结果
            IAsyncResult result = myDelegate.BeginInvoke(null,null);}


在数据绑定完成后,隐藏动图。
string LoadData()
        {        
            string sql = string.Format(@"SELECT   TOP (100000) id AS ID, name AS NAME, seq_no AS SEQUENCE, description, last_update_date AS L_TIME
                    FROM      test_t ORDER BY ID ");
            DataTable dt = db.GetTableInfoBySQL(sql, db.sqlDB);
            if (dt != null)
            {
                setData(dt);
            }
            //数据加载完成后,隐藏动图
            pictureVisible("a");
            return "OK";
        }

#6


你的代码执行完,在后面加上调用。

#7


引用 楼主 a200507002 的回复:
C#中,新建一个方案,有两个FORM,第一个FORM里面主要是一个DATAGRIDVIEW控件,用于从数据库绑定加载数据。
第二个FORM,主要是一个动态图片,显示加载中。
想要实现的结果是:点开第一个页面时,准备从数据库获取数据绑定,这时先弹出第二个FORM,显示数据加载中,然后第一个FORM在后台或者其他进程中加载数据,当DATAGRIDVIEW数据加载完成后,关闭掉第二个FORM。
求这样一个方案,最好有代码实现,感谢。

主要过程如下代码所示:
private void frm1_load(object sender, EventArgs e)
            {
                //弹出FORM2 ,显示加载中
             Form frm2 = new Form();
             frm2.ShowDialog();
                //FORM1 后台进行数据加载
             LoadData(frm1.dataGridView1);
                //加载完成后关闭FORM2
             frm2.Close();
            }


这个应该对的 不管webfrom 还是winfrom 处理类似的 一般都是多线程 可以找下载进度条的实例看看

#1


可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。

#2


frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide

#3


引用 1 楼 xuggzu 的回复:
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。


由于FORM2 里面主要是包含一张动态图,显示数据加载中,不让界面FORM1呈现假死状态,同时让用户等待后续操作。如果用SHOW的话,动图显示不出来。 我之前也是用的SHOW,就是因为显示不出来动图,才改为ShowDialog的。

#4


引用 2 楼 caozhy 的回复:
frm2.ShowDialog();
->
frm2.Show();
主界面加载完调用Hide

版主说的主界面加载完,这里如何判断的?

#5


引用 1 楼 xuggzu 的回复:
可以把Form2显示扔到一个线程里,然后用标志位判读是否需要关闭Form2。但Form2显示必须用show(),而不是showdialog()。
大致代码如下:
void form1_Load(xxxxx)     // form1的load事件
{
    bool flag = false;
    Form2 frm2 = new Form2();
    frm2.StartPosition = xxx.centerscreen;
    Task task = Task.Factory.StartNew(() =>
    {
        frm2.Show();
        while(!flag)
        { Thread.Sleep(100);}
        frm2.Close();
        frm2.Dispose();
    });
    LoadData(frm1.dataGridView1);
    flag = true;
}

缺点是:form2不能移动操作。

我用你这种方法测试了,是可以实现,但是有个问题,FORM2 只是闪现就没有了,大数据加载界面也会出现假死的情况。
看来这种方法实现难度比较大。 我把FORM2 去掉,在FORM1上加一个PritureBox,放上动图。 平时隐藏,加载数据的时候显示出来,这样也可以实现。
主要代码如下:
private void tsBtnLoad_Click(object sender, EventArgs e)
        {
            this.pictureBox1.Visible = true;
            this.dataGridView1.DataSource = null;
            //建立委托
            MyDelegate myDelegate = new MyDelegate(LoadData);
            //异步调用委托,获取计算结果
            IAsyncResult result = myDelegate.BeginInvoke(null,null);}


在数据绑定完成后,隐藏动图。
string LoadData()
        {        
            string sql = string.Format(@"SELECT   TOP (100000) id AS ID, name AS NAME, seq_no AS SEQUENCE, description, last_update_date AS L_TIME
                    FROM      test_t ORDER BY ID ");
            DataTable dt = db.GetTableInfoBySQL(sql, db.sqlDB);
            if (dt != null)
            {
                setData(dt);
            }
            //数据加载完成后,隐藏动图
            pictureVisible("a");
            return "OK";
        }

#6


你的代码执行完,在后面加上调用。

#7


引用 楼主 a200507002 的回复:
C#中,新建一个方案,有两个FORM,第一个FORM里面主要是一个DATAGRIDVIEW控件,用于从数据库绑定加载数据。
第二个FORM,主要是一个动态图片,显示加载中。
想要实现的结果是:点开第一个页面时,准备从数据库获取数据绑定,这时先弹出第二个FORM,显示数据加载中,然后第一个FORM在后台或者其他进程中加载数据,当DATAGRIDVIEW数据加载完成后,关闭掉第二个FORM。
求这样一个方案,最好有代码实现,感谢。

主要过程如下代码所示:
private void frm1_load(object sender, EventArgs e)
            {
                //弹出FORM2 ,显示加载中
             Form frm2 = new Form();
             frm2.ShowDialog();
                //FORM1 后台进行数据加载
             LoadData(frm1.dataGridView1);
                //加载完成后关闭FORM2
             frm2.Close();
            }


这个应该对的 不管webfrom 还是winfrom 处理类似的 一般都是多线程 可以找下载进度条的实例看看