根据勾选的复选框的数量,更新进度条

时间:2014-05-11 15:16:08

标签: c# checkbox progress-bar

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

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,但后来我不知道如何用这些数据更新进度条。

2 个答案:

答案 0 :(得分:0)

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之间的整数。

答案 1 :(得分:0)

注意:此回答由OP提供,最初是他的问题的一部分。我已将其移至此处以符合网站指南。


感谢您的建议。我找到了自己满意的解决方案。因为我是C#的新手,所以必须提出一个我了解的解决方案。

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

var cbs = new List<CheckBox>();


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

        else
        {
            cbs.Remove(imageinfo);
        }    

然后我将收集计数除以100。并将其作为变量“间隔”

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();

        }

进度=进度+间隔。这意味着如果我勾选了5个复选框。间隔为20,并且每次完成勾选的过程,进度条就会增加20。

这可能是很脏的代码,所以我仍然非常感谢关于如何更好地完成工作的建议。但是,正如您所看到的,我的知识是非常基础的,所以很多事情直达我的脑海。