winforms 如何用进度栏连接多个文本框?

ifsvaxew  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(123)

一周前我刚开始学习编程语言C#,用的是带win Forms的Visual Studio程序,几天来一直遇到问题。
我想将一个进度条连接到不同的文本框。这样,随着每个文本框的填充,进度条会增加。当文本被删除时,进度条会再次下降。到目前为止,我只设法让进度条增加一般或进度条随着文本框中的每个字母增加。

  • 文本框是Vorname,Nachname,PLZ,沃诺尔特,豪斯努默,街 *
  • 进度条是最棒的 *
private void button1_Click(object sender, EventArgs e)
{

    Fortschrittsanzeige.Dock = DockStyle.Bottom;
    Fortschrittsanzeige.Maximum = 60;
    Fortschrittsanzeige.Minimum = 0;
    Fortschrittsanzeige.Style = ProgressBarStyle.Continuous;

    if  (
        Vorname.Text.Length <= 0 ||
        Nachname.Text.Length <= 0 ||
        PLZ.Text.Length < 4 ||
        Wohnort.Text.Length <= 0 ||
        Hausnummer.Text.Length <= 0 ||
        Straße.Text.Length <= 0
    )
    {
        textBox7.Text = ("Bitte überprüfe deine Eingabe");
    }
    else
    {
        Sendebutton.Text = "Gesendet";
        textBox7.Text = "Vielen Dank" + Vorname.Text + " " + Nachname.Text + ", wir
        haben deine Daten erhalten.";
    }

    if (Vorname.Text.Length <= 0)
    {
        Vorname.BackColor = Color.IndianRed;
    }
    else
    {
    Vorname.BackColor = Color.White;
    Fortschrittsanzeige.Value += 10;
    }

    if (Nachname.Text.Length <= 0)
    {
        Nachname.BackColor = Color.IndianRed;
    }
    else
    {
        Nachname.BackColor = Color.White;
        Fortschrittsanzeige.Step += 10;
    }

    if (PLZ.Text.Length < 4)
    {
        PLZ.BackColor = Color.IndianRed;
    }
    else
    {
        PLZ.BackColor = Color.White;
        Fortschrittsanzeige.Step += 10;
    }

    if (Wohnort.Text.Length <= 0)
    {
        Wohnort.BackColor = Color.IndianRed;
    }

    else
    {
        Wohnort.BackColor = Color.White;
        Fortschrittsanzeige.Step += 10;
    }

    if (Hausnummer.Text.Length <= 0)
    {
        Hausnummer.BackColor = Color.IndianRed;
    }

    else
    {
        Hausnummer.BackColor = Color.White;
        Fortschrittsanzeige.Step += 10;
    }

    if (Straße.Text.Length <= 0)
    {
        Straße.BackColor = Color.IndianRed;
    }

    else
    {
        Straße.BackColor = Color.White;
        Fortschrittsanzeige.Step += 10;
    }
}
kq0g1dla

kq0g1dla1#

可以按如下方式处理每个TextBox上的TextChanged事件

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0 && _textbox1IsEmpty)
        {
            progressBar1.Value += 10;
            _textbox1IsEmpty = false;
        }
        else if (textBox1.Text.Length <= 0)
        {
            progressBar1.Value -= 10;
            _textbox1IsEmpty = true;
        }

    }

并在类中添加私有属性

private bool _textbox1IsEmpty = true;

您可以创建一个函数来优化它,并且不需要重复代码

bxjv4tth

bxjv4tth2#

以下是一些提示,帮助您开始使用WinForms,并使使用ProgressBar连接多个TextBox变得更加容易。

  • Form上的文本框(和其他控件)可以在窗体的Controls集合中找到。
  • 表单上的所有文本框都可以通过一个简单的查询获得。

例如,在构造函数表单中,您可以遍历所有文本框,并为每个文本框附加一个TextChanged处理程序。

public MainForm()
{
    InitializeComponent();
    foreach (TextBox textBox in Controls.OfType<TextBox>()) 
    {
        textBox.TextChanged += onAnyTextChanged;
        onAnyTextChanged(textBox, EventArgs.Empty); // Initialize
    }
    ActiveControl = Fortschrittsanzeige;
}
  • 多个文本框可以全部指向一个公共事件处理程序。
  • System.Linq减少了匹配和排序等操作所需的代码量。

我们所能做的是,每当 * 任何 * 文本框更改时,基于 * 所有 * 文本框执行验证。

const int TEXTBOX_COUNT = 6;
private void onAnyTextChanged(object? sender, EventArgs e)
{
    if(sender is TextBox textbox)
    {
        bool isValid;
        if(textbox.PlaceholderText == "PLZ")
        {
            isValid = textbox.TextLength > 3;
        }
        else
        {
            isValid = !string.IsNullOrWhiteSpace(textbox.Text);
        }
        textbox.BackColor = isValid ? Color.White : Color.LightSalmon;
    }

    // Use System.Linq to count the number of valid textboxes (based on BackColor).
    float countValid = 
        Controls
        .OfType<TextBox>()
        .Count(_=>_.BackColor== Color.White);

    var pct = countValid / TEXTBOX_COUNT;
    Fortschrittsanzeige.Value = (int)(pct * Fortschrittsanzeige.Maximum);
    Sendebutton.Enabled = countValid.Equals(TEXTBOX_COUNT);
    Fortschrittsanzeige.Visible = !Sendebutton.Enabled;        
}

该处理程序允许“特殊情况”,如果更改的值不再有效,将使Fortschrittsanzeige返回。

当所有文本框均有效时,隐藏Fortschrittsanzeige并启用Sendebutton

相关问题