c#.Net在文本框中每次打印字符串的一个字符

本文关键字:字符 一个 字符串 打印 文本 Net | 更新日期: 2023-09-27 18:13:58

我是c#新手,我需要你的帮助,我想在文本框中一次显示一个字符,这是我的代码

private void timer1_Tick(object sender, EventArgs e)
{
    int i = 0;  //why does this don't increment when it ticks again?
    string str = "Herman Lukindo";
    textBox1.Text += str[i];
    i++; 
}
private void button1_Click(object sender, EventArgs e)
{
    if(timer1.Enabled == false )
    {
        timer1.Enabled = true;
        button1.Text = "Stop";
    }
    else if(timer1 .Enabled == true )
    {
        timer1.Enabled = false;
        button1.Text = "Start";
    }
}

c#.Net在文本框中每次打印字符串的一个字符

为什么这个不增加当它再次滴答?

因为变量i是事件的本地变量。您需要在类级别定义它。

int i = 0;  //at class level
private void timer1_Tick(object sender, EventArgs e)
{
    string str = "Herman Lukindo";
    textBox1.Text += str[i];
    i++; 
}

在退出事件时,变量i将超出作用域并失去其值。在下一次事件中,它被认为是一个初始值为0的新的局部变量。

接下来,您还应该查找跨线程异常。因为你的TextBox没有在UI线程上得到更新。

你的代码的问题是,你是分配i = 0与每个tick,所以它将永远是0每次使用。我建议使用类级别变量。

然而,在类级别使用变量意味着您将需要在某些时候重置为0,可能每次启动计时器时。

进一步的一点是,您将需要验证tick事件,以确保您不会尝试访问不存在的索引(IndexOutOfRangeException)。对于这种情况,我建议在打印完最后一个字母后自动停止计时器。

考虑到这些,下面是我建议的代码:
int i = 0;// Create i at class level to ensure the value is maintain between tick events.
private void timer1_Tick(object sender, EventArgs e)
{
    string str = "Herman Lukindo";
    // Check to see if we have reached the end of the string. If so, then stop the timer.
    if(i >= str.Length)
    {
        StopTimer();
    }
    else
    {
        textBox1.Text += str[i];
        i++; 
    }
}
private void button1_Click(object sender, EventArgs e)
{
    // If timer is running then stop it.
    if(timer1.Enabled)
    {
        StopTimer();
    }
    // Otherwise (timer not running) start it.
    else
    {
        StartTimer();
    }
}
void StartTimer()
{
    i = 0;// Reset counter to 0 ready for next time.
    textBox1.Text = "";// Reset the text box ready for next time.
    timer1.Enabled = true;
    button1.Text = "Stop";
}
void StopTimer()
{
    timer1.Enabled = false;
    button1.Text = "Start";
}