【发布时间】:2012-01-06 10:37:23
【问题描述】:
我正在尝试创建一个如下所示的进度条类。如果孩子剩余时间大于父母剩余时间,那么父母应该等于孩子剩余时间。
在下面的方法 CalcETA() 中,我无法访问孩子的属性。我想如果我知道我在哪个列表项# 我可以以某种方式访问 ProgressBarList[myIndex+1] 值...
public class ProgressBars
//NOTE: Not working yet
// used to keep track of multiple progress bars and the time remaining.
// recommended to set as default: Min = 1, Max = 100, Step = 1, Value = 1 in progress bar property control.
{
public List<ProgressBarItem> ProgressBarList;
public bool Started { get; set; } // set to true if you want to keep track of when to update bars on form.
public string Status { get; set; } // general text
public class ProgressBarItem
{
public bool HasChild { get; set; } // if HasChild = True then parent TimeRemaining must not be less than childs.
public int Maximum { get; set; }
public int Value { get; set; }
public string Text { get; set; }
public DateTime StartTime { get; set; }
public TimeSpan TimeRemaining { get { return CalcETA(HasChild, StartTime, Value, Maximum); } }
public TimeSpan ElapsedTime { get { return DateTime.Now - StartTime; } }
}
private static TimeSpan CalcETA(bool HasChild, DateTime StartTime, int counter, int counterGoal)
{ // Calculate the time remaining for the process
if (HasChild)
{
//TODO: How do I get the child's StartTime?
TimeSpan timeElapsed = DateTime.Now - StartTime;
return GetETAFromTimeElapsed(timeElapsed, counter, counterGoal);
}
else
{
TimeSpan timeElapsed = DateTime.Now - StartTime;
return GetETAFromTimeElapsed(timeElapsed, counter, counterGoal);
}
}
private static TimeSpan GetETAFromTimeElapsed(TimeSpan ts, int Counter, int CounterMax)
{
if (Counter != 0) // do not divide by zero
{
double minLeft = (ts.TotalMinutes / Counter) * (CounterMax - Counter);
return TimeSpan.FromMinutes(minLeft);
}
else
return default(TimeSpan);
}
更新 1:
注意问题应该是:如果一个类包含一个自定义类的列表,我如何在列表项获取属性时获取类列表项#?
听起来我需要查找嵌套类,谢谢这个词。 也许这更清楚: 问题:子进度条的剩余时间 (ETA) 为 5 分钟。父进度条的 ETA 为 2 分钟,这具有误导性。因此也将父进度条设置为 5 分钟。
- 每个进度条都是列表中的一个类。即
List<MyProgressBar> - 每个进度条都需要计算 ETA。
- 在计算任何进度条的 ETA 时,检查它是否有子进度条,以及当前 ETA
- 我假设添加到列表中的每个项目都是上述项目的子项。 (可能是错误的假设)
- 由于每个进度条都是列表中的一个项目,因此如何: a) 我可以在类方法中获取当前列表索引号吗?即列表[编号]。 b)我可以访问其他列表项值(例如孩子开始时间)吗?即 List[childnum]。
想法: 1.当我休息时,我虽然可以重写 List.Add() 方法来插入项目 #?但是我必须保持这个值。
【问题讨论】:
-
好的,但是如何在您的方案中建立父子关系?你怎么知道哪个 ProgressBarItem 是另一个的孩子?
-
可能值得看一下Microsoft Naming Guidelines,代码有一些不一致,这是我最讨厌的。
-
也许我需要重新假设添加的进度条是添加的最后一项的子项。
标签: c# progress-bar