我有一个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()对吗?任何关于解决方案的指导都是很好的。
答案 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);
}