TabPage冻结应用程序

时间:2014-05-30 15:47:16

标签: c# tabcontrol tabpage

我有一个TabControl,有几个TabPages。我要做的是更改标签,并让它在另一个标签上调用richtextbox。在代码之后我会尝试更好地说出问题......

    void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        switch(tabControl1.SelectedTab.Name)
        {
            case "tabPage_ProdOrders":
                dostuff();
                break;
        }


        //throw new System.NotImplementedException();
    }

    void dostuff()
    {
        while (tabControl1.SelectedTab == tabControl1.TabPages["tabPage_ProdOrders"])
        {
            safeCall("testing...\n");
            Thread.Sleep(10000);
        }
    }

    delegate void SetTextCall(string s);

    public void safeCall(string s)
    {
        if (this.richTextBox1.InvokeRequired)
        {
            SetTextCall d = new SetTextCall(safeCall);
            this.Invoke(d, new object[] { s });
        }
        else this.richTextBox1.AppendText(string.Format(":{0}:\n",s));
    }

我知道它看起来很草率 - 对不起。所以richtextbox驻留在tabpage" tabPage_DEV"。我想要发生的是当我改为tabpage" tabPage_ProdOrders"让它将文本附加到&tabied_DEV"上的richtextbox。这是一个测试,以确保一切顺利,我最终将发生的是一次" tabPage_ProdOrders"选中我将有一个绑定到我的数据库的gridview,只要选择该页面,它将每隔X秒从数据库刷新一次。问题是,只要我选择" tabPage_ProdOrders"整个应用程序冻结。我假设这是由于我在while循环中的Thread.Sleep()(我的假设是,因为那个空格是窗口的一部分,当它是.Sleep()时,整个形式是.Sleep()对吗?任何关于解决方案的指导都是很好的。

2 个答案:

答案 0 :(得分:1)

在表单中添加一个Timer,并将其Tick事件编码为所有数据库内容。

更改dostuff方法,如下所示:

void dostuff()
{
    if (tabControl1.SelectedTab == tabControl1.TabPages["tabPage_ProdOrders"])
    {
        dbTimer.Interval = 10000; // your interval in ms
        dbTimer.Start();
    }
    else dbTimer.Stop();

}

使用Thread.Sleep(..)发送当前的,即GUI线程进入休眠状态。不是你想要的......

答案 1 :(得分:0)

我使用了类似于TaW的建议......

    delegate void populateProdOrders(DataTable dt);

    public void safePopulate(DataTable dt)
    {
        if (this.dataGridView2.InvokeRequired)
        {
            populateProdOrders d = new populateProdOrders(safePopulate);
            this.Invoke(d, new object[] { dt });
        }
        else this.dataGridView2.DataSource = dt;
    }

    public Form1()
    {
        // stuff
        System.Timers.Timer refreshProdOrders = new System.Timers.Timer(5000);
        refreshProdOrders.Elapsed += refreshProdOrders_Elapsed;
        refreshProdOrders.AutoReset = true;
        refreshProdOrders.Enabled = true;

    }

    void refreshProdOrders_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //dostuff();
        var globes = SharedResourceVariables.globals;
        DataTable dt = new DataTable();

        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(globes.SQLConn);
        using (conn)
        {
            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("development_usp_viewProdductionOrders", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            using (cmd)
            {
                conn.Open();
                System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
                conn.Close();
            }
        }
        safePopulate(dt);
    }