根据选中了多少个复选框进行进度条更新

本文关键字:更新 复选框 多少 | 更新日期: 2023-09-27 18:02:50

我几乎完成了这个,但是我的进度条真的不是很好。我有很多复选框。如果选中一个复选框,则将运行一个设置好的进程。如果选中另一个复选框,则将运行另一个给定进程。下面是代码

的示例
if (pslist.Checked == true)
{
      progress = 9;
      backgroundWorker1.ReportProgress(progress);
      string commandlineargs = "-f " + imagefile + " --profile=" + profile + " pslist" + " --output-file=" + output + @"'pslist.txt";
      Process process = new Process();
      ProcessStartInfo startInfo = new ProcessStartInfo();
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
      startInfo.FileName = vollocation;
      startInfo.Arguments = commandlineargs;
      process.StartInfo = startInfo;
      process.Start();
      process.WaitForExit();
      process.Close();
}

对于我的表单中的每个复选框,都有非常类似的代码,只是做了一些更改。

"progress"变量是我更新进度条的方式,backroundworker报告进度(如你所见)

对于每个复选框,我将进度变量增加3。所以当你到达最后一个复选框progress = 100

这很好,但如果用户只勾选前三个复选框,进度条将从0%变为3%,再变为6%,然后在最后直接跳到100%,这就不太好了。

谁有什么建议,如何使这个更聪明一点?

我的第一个想法是将选中的复选框的数量除以100,但这样我就不知道如何使用这些数据更新进度条

根据选中了多少个复选框进行进度条更新

Checkbox[] checkboxes;    
public void FormInitializationOrWhatever()
{
    Checkbox checkboxName1 = new CheckBox(), checkboxName2 = new CheckBox(), ...
    this.checkboxes = new CheckBox[] { checkboxName1, checkboxName2, ... };
    foreach (CheckBox cb in this.checkboxes)
    {
        cb.CheckedChanged += onSomeCheckboxWasClicked;
    }
}    
void onSomeCheckboxWasClicked(object sender, EventArgs e)
{
    progress = (int)(((float)this.checkboxes.Count(cb => cb.Checked) / this.checkboxes.Length) * 100);
}

基本上,将所有复选框保存在一个集合中,并调用一个方法,该方法在每次更新复选框时更新进度。还有其他方法可以做到这一点,我使用了事件驱动的样式。

progress = (int)((float)this.checkboxes。Count(cb => cb. checked)/this.checkboxes.Length) * 100);

应该给出被选中的复选框占复选框总数的百分比,以0到100之间的整数表示。

注:这个答案是OP提供的,最初是他问题的一部分。我把它移到了这里,以便与网站指南保持一致。


谢谢你的建议。我已经找到了一个令我满意的解决方案。因为我是c#新手,所以我必须想出一个我能理解的解决方案。

基本上,我创建了一个集合,然后使用if语句根据是否选中复选框从集合中添加或删除复选框。

var cbs = new List<CheckBox>();

        if(imageinfo.Checked == true)
        {
            cbs.Add(imageinfo);
        }
        else
        {
            cbs.Remove(imageinfo);
        }    

然后用100除以集合计数。并将其作为变量interval

int interval = 100 / cbs.Count;

然后在每个进程中

if (imageinfo.Checked == true)
        {
            progress = progress + interval;
            string commandlineargs = "-f " + imagefile + " imageinfo" + " --output-file=" + output + @"'imageinfo.txt";
            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            startInfo.FileName = vollocation;
            startInfo.Arguments = commandlineargs;
            process.StartInfo = startInfo;
            process.Start();
            process.WaitForExit();
            process.Close();
        }

progress =进度+间隔。这意味着如果我有5个勾选框。间隔将为20,并且每当选中的进程完成时,进度条将上升20。

这可能真的是很脏的代码,所以我仍然非常感谢关于如何做得更好的建议。但是正如你所看到的,我的知识是非常基础的,所以很多事情都是我无法理解的。