嗯,我想我知道答案,但我很感激任何人确认我怀疑的。
我有大量dictionary
个邮政编码需要在程序启动时加载。它需要10-15秒,我希望有progressbar
可以显示进度。我可以制作进度条,并将总计数指定为设置。但是从我在其他问题上发现的情况来看,dictionary.count
似乎无法与进度条绑定,并希望定期更新。
这是真的吗?如果是这样,还有另一种方式吗?
现在字典是硬编码的,但我打算在将来的某个时候改变它,并从文件中加载它。我知道在那一点上我可以使用foreach
循环每次更新计数,但这似乎是一种kludge-ish。有没有更好的实施方式?
修改
根据要求,加载zipcode的字典的代码(实际上有大约40,000个条目,但我想我会节省空间:p):
static class ZipCodes
{
#region Methods
public static string GetValue(string key)
{
string result;
if (zipCodeDictionary.TryGetValue(key, out result))
{
return result;
}
else
{
return null;
}
}
public static int GetCount()
{
return zipCodeDictionary.Count();
}
#endregion
#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();
public static void PopulateZipCodeDictionary()
{
zipCodeDictionary.Add( "00501", "Holtsville, NY" );
zipCodeDictionary.Add( "00544", "Holtsville, NY" );
zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
zipCodeDictionary.Add( "00602", "Aguada, PR" );
zipCodeDictionary.Add( "00603", "Aguadilla, PR" );
zipCodeDictionary.Add( "00604", "Aguadilla, PR" );
答案 0 :(得分:2)
最简单的方法是拥有不确定的进度条。但是,如果要显示绑定的进度条,可以实现INotifyPropertyChanged,并且具有一个公共属性,该属性也会随着每个Add操作而增加,并且进度条绑定到此属性。
static class ZipCodes: INotifyPropertyChanged
{
#region Methods
public static string GetValue(string key)
{
string result;
if (zipCodeDictionary.TryGetValue(key, out result))
{
return result;
}
else
{
return null;
}
}
public static int GetCount()
{
return zipCodeDictionary.Count();
}
#endregion
#region property
private static int progress=0;
Public static int LoadingProgress
{
get
{
return progress;
}
set
{
if(value!=progress)
{
progress = value;
NotifyPropertyChanged("LoadingProgress");
}
}
}
#endregion
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
#endregion
#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();
public static void PopulateZipCodeDictionary()
{
zipCodeDictionary.Add( "00501", "Holtsville, NY" );
LoadingProgress++;
zipCodeDictionary.Add( "00544", "Holtsville, NY" );
LoadingProgress++;
zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
LoadingProgress++;
答案 1 :(得分:1)
您可以通过派生Dictionary<TKey, TValue>
来创建自己的字典实现。此实现还可以实现接口INotifyCollectionChanged
并在调用覆盖的Add
方法时引发事件。然后,您的应用程序可以收听此事件并相应地更新进度条。
话虽如此,我不会这样做。如果加载只需几秒钟,我只会显示一个不确定的进度条。它更简单,更充足。
答案 2 :(得分:1)
如果加载过程确实需要很长时间,您可以使用BackgroundWorker
。继承人怎么做
创建BackgroundWorker
对象。
将其WorkerReportsProgress
属性设置为True。
处理DoWork
事件以加载字典,定期报告进度
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Code to add entries to dictionary
...
// Periodically, report progress using this call (in percentage)
backgroundWorker.ReportProgress(percentProgress);
}
处理ProgressChanged
事件以更新进度条
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}