如何在运行时方法中立即更改标签文本?

时间:2013-03-07 07:33:58

标签: c# properties runtime

我已经通过stackoverflow搜索但找不到答案。我不知道我是否可以清楚地提出这个问题。不管怎么说,我不是说英语的人=。=

我正在使用c#和visual studio 2010进行开发。 我正在制作一个表格供用户登录,我想在加载事件期间测试sql server连接。

看似简单,代码是:

    private void testDBconnection()
    {
        label3.Text = "Connecting to Database Server......";

        SqlServerConnection ssc = new SqlServerConnection();
        bool conOK = ssc.isConnectable(ssc.makeConnectionString(
            SqlServerConnParamters.SqlServerIPAddress,
            SqlServerConnParamters.AccountValidationDatabaseName,
            SqlServerConnParamters.SqlServerUserName,
            SqlServerConnParamters.SqlServerPassword,
            5));
        if (conOK)
        {
            label3.Text = "";
        }
        else
        {
            label3.Text = "Database connection failed";
            button1.Enabled = false;
        }
    }

我把这个方法放在Form_Load事件中。

但是在运行时,此过程甚至在此表单显示之前就开始了。默认情况下验证可能会持续15秒(我将其设置为5,但也需要时间)。如果连接有问题,它将显示为无法打开程序,但在连接数据库失败后会显示。

我的目的是通过Label3显示"连接到数据库服务器......"告诉用户,并告诉用户连接是否失败。

我试图找到表格事件,例如" Loaded_Complete"或者#34; Loaded"(我发现Form_Closed虽然),但我不能。

我想它与线程,程序睡眠有关,否则。我希望有人可以帮助我。非常感谢你们!

3 个答案:

答案 0 :(得分:2)

我会以这种方式使用BackgroundWorker。这将推迟数据库检查操作,并且表单加载不会被它锁定。

label3.Text = "Connecting...";
button1.Enabled = false;

var bkw = new BackgroundWorker();
bkw.DoWork += (s, ev) =>
    {
        SqlServerConnection ssc = new SqlServerConnection();
        ev.Result = ssc.isConnectable(ssc.makeConnectionString(
                        SqlServerConnParamters.SqlServerIPAddress,
                        SqlServerConnParamters.AccountValidationDatabaseName,
                        SqlServerConnParamters.SqlServerUserName,
                        SqlServerConnParamters.SqlServerPassword, 5));
    };

bkw.RunWorkerCompleted += (s, ev) =>
    {
        if ((bool)ev.Result == true)
        {
            label3.Text = "Connected";
            button1.Enabled = true;
        }
        else
        {
            label3.Text = "Database connection failed";
        }

        bkw.Dispose();
    };

bkw.RunWorkerAsync();

但是,这需要一些异常处理。如果DoWork事件中发生异常,那么您可以检查RunWorkerCompleted事件,其中ev.Error是否为null(它包含异常)并做出相应的反应。

答案 1 :(得分:0)

使用timer。 在表单加载事件中,启动timer(将间隔设置为2秒或您想要的任何内容)。当timer ticks调用您的连接方法时。在testDBconnection()方法开始时,请停止timer并将其丢弃,因为您不再需要它。

答案 2 :(得分:0)

你不应该在表单加载时使用Form_Load事件来触发事件,你应该覆盖OnLoad()方法,这样就可以控制代码被触发的时间(多个订阅者可以监听Form_Load和你不知道他们将以什么顺序跑。)

让屏幕刷新的最快最脏的方法是添加

Application.DoEvents();

更改标签后,会强制屏幕更新。总的来说,虽然这是不好的做法,上面的背景线程将是一个更好的长期解决方案。