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

本文关键字:标签 文本 运行时 方法 | 更新日期: 2023-09-27 18:02:36

我已经通过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显示"连接到数据库服务器......"告诉用户,并告诉用户连接失败。

我试图找到表单事件像"加载完成",或"加载"(我发现Form_Closed虽然),但我不能。

我猜它与线程,程序睡眠或其他有关。我希望有人能帮我。谢谢大家!

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

我会这样使用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事件是否发生异常。Error是否为空(它包含异常),并做出相应的反应

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

你不应该在表单加载时使用Form_Load事件来触发事件,你应该重写OnLoad()方法,这样你就可以控制代码何时被触发(有可能有多个订阅者正在听Form_Load,你不知道它们将以什么顺序运行)。

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

Application.DoEvents();

更改标签后,这将强制屏幕更新。一般来说,虽然这是不好的做法,但从长远来看,上述后台线程将是一个更好的解决方案。