TaskListManager
在繁琐的日常日程中,只有像这样的工具才能帮助我们稍微整理一下。
引言
TaskManager 是一个个人信息管理器 (PIM)。它是一个用于管理各种个人信息的工具,例如任务、事件、联系人、收藏夹和网络链接,这些信息可以在同一个表单上浏览。它可以作为思维刺激器,以及自我分析和自我改进工具。
在 TaskManager 中,没有使用数据库;所有相关信息都存储在 XML 文件中。它可以是两个 XML 文件互操作性的最佳示例之一。
我们无需安装数据库即可使用此应用程序。
主要有三个部分
任务管理: 提醒未完成的任务。添加、删除、编辑和将任务列表导出为 HTML 或 Excel 文件。要添加或编辑任务列表,我们需要单击左侧窗格中的“任务”按钮。
所有未完成的任务将以工具提示的形式显示在托盘图标中。单击工具提示时,用户可以显示主表单。
联系人管理: 以树状视图查看联系人,易于导航,添加和删除联系人。为所有联系人创建组。
互联网收藏夹: 从 Internet Explorer 收藏夹列表中获取所有文件夹和链接,并将其显示为树状视图。导航到收藏夹节点并在同一表单的网页浏览器中显示页面。安装应用程序后,它将在运行时获取收藏夹。
使用代码
我尝试使其自解释且分层。主要的类是:TreeViewSerializer.cs、ContactForm.cs 和 TaskManagerForm.cs。
以下方法将负责在 TaskList XML 文件的任务表中添加任务。
/// <summary>
/// Utility method to update the visual representation of
/// the tasks (the CheckedListBox) with a new or updated row.
/// </summary>
/// <param name="rowIndex">Index of modifed row, or -1 for new row</param>
/// <param name="row">Row object from the DataTable</param>
private void UpdateDisplayWithRow(int rowIndex, TasksDataSet.TasksRow row)
{
string title, format = "{0} - Due: {1:d}";
title = string.Format(format, row.TaskTitle, row.TaskDueDate);
if (rowIndex == -1)
{
tasksCheckedListBox.Items.Add(title, row.TaskComplete);
}
else
{
// Remove the old value, add a new one, set the checkbox
tasksCheckedListBox.Items.RemoveAt(rowIndex);
tasksCheckedListBox.Items.Insert(rowIndex, title);
tasksCheckedListBox.SetItemChecked(rowIndex, row.TaskComplete);
}
}
/// <summary>
/// Loads the entries using XML deserialization
/// </summary>
public void LoadEntries()
{
try
{
XmlSerializer s = new XmlSerializer(typeof(TasksDataSet));
TextReader r = new StreamReader("TaskList.xml");
ds = (TasksDataSet)s.Deserialize(r);
r.Close();
}
catch
{
ds = new TasksDataSet();
}
foreach (TasksDataSet.TasksRow row in ds.Tasks)
{
UpdateDisplayWithRow(-1, row);
}
}
/// <summary>
/// Saves the entries using XML serialization
/// </summary>
public void SaveEntries()
{
try
{
XmlSerializer s = new XmlSerializer(typeof(TasksDataSet));
TextWriter w = new StreamWriter("TaskList.xml");
s.Serialize(w, ds);
w.Close();
}
catch( Exception x )
{
appNotifyIcon.ShowBalloonTip(8000,
"Bh@nu's - Task Manager",
"Tasks could not be saved.\n" + x.Message, ToolTipIcon.Error);
}
}
CheckTaskDates()
方法将检查任务列表中的任务到期情况。所有未完成的任务将每分钟以工具提示的形式显示在托盘图标上。
/// <summary>
/// Scans the list of tasks. Any incomplete tasks due
/// yesterday or earlier are appended to a buffer for
/// display in the tooltip.
/// </summary>
private void CheckTaskDates()
{
// StringBuilder is more efficient than string concatentation
StringBuilder buffer = new StringBuilder();
// Iterate over each task in the DataSet
foreach (TasksDataSet.TasksRow row in ds.Tasks)
{
// Compare date and completed flag
if ((DateTime.Now.Date > row.TaskDueDate) && !row.TaskComplete)
{
buffer.Append(row.TaskTitle).Append(", Due: ");
buffer.AppendFormat("{0:d}", row.TaskDueDate).Append('\n');
}
}
// If the buffer is not empty, there is at least one
// task to display
if (buffer.Length > 0)
{
// Display an Info balloon tip for 8 seconds
appNotifyIcon.ShowBalloonTip(8000,
"bh@nu's - Task Manager",
buffer.ToString(), ToolTipIcon.Info);
}
}
ContactForm
类中还有另一个重要的方法。此方法将负责将新联系人添加到两个 XML 文件中,以及其唯一的组和 ID。一个 XML 文件将包含树状视图数据,另一个 XML 文件将包含详细信息。我创建这两个 XML 文件是为了方便显示树状视图。
private void btnUpdate_Click(object sender, System.EventArgs e)
{
TreeViewSerialization.TreeViewSerializer objTreeViewSerializer =
new TreeViewSerialization.TreeViewSerializer();
//objTreeViewSerializer.SerializeTreeView(this.treeView_Contacts,
// Application.StartupPath + "\\..\\..\\bhanu.xml");
objTreeViewSerializer.SerializeTreeView(this.treeView_Contacts,
Application.StartupPath + "\\bhanu.xml");
bool bAddNew = (m_iContactID == 0) ? true : false;
bool bContinue = true;
try
{
string sFullName = txt_Name.Text;
string sCellPhone = txt_Cell.Text;
string sHomePhone = txt_Home.Text;
string sEmail = txt_Email.Text;
string sEmail2 = txt_Email2.Text;
string sAddress = txt_Address.Text;
string sCity = txt_City.Text;
string sState = cmb_State.Text;
string sZip = txt_Zip.Text;
string sBDay = dt_DateTimePicker.Value.ToLongDateString();
if( sFullName == "" || sCellPhone == "" ||
sHomePhone == "" || sEmail == "" ||
sEmail2 == "" || sAddress == "" ||
sCity == "" || sState == "" ||
sZip == "" || sBDay == "" )
{
MessageBox.Show( "You must have valid data in each field before" +
" you may\nadd this contact to your contact's list.",
"Validation Error...", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation );
bContinue = false;
}
if( bContinue )
{
if( bAddNew == true )
{
AddContact( m_XmlDocument, m_iNextID, sFullName,
sCellPhone, sHomePhone, sEmail, sEmail2, sAddress,
sCity, sState, sZip, sBDay );
AddContactToCombo( m_iNextID, sFullName );
m_iNextID++;
}
else
{
UpdateContact( m_XmlDocument, m_iNextID, sFullName,
sCellPhone, sHomePhone, sEmail, sEmail2, sAddress,
sCity, sState, sZip, sBDay );
}
m_XmlDocument.Save( m_sXmlFileName );
}
}
catch( Exception exception )
{
MessageBox.Show( exception.Message );
}
}
private void treeView_Contacts_AfterSelect(object sender, TreeViewEventArgs e)
{
AddNewContact();
if (treeView_Contacts.SelectedNode.Text == "Friends" ||
treeView_Contacts.SelectedNode.Text == "Work")
{
return;
}
else
{
this.txt_Name.Text = this.treeView_Contacts.SelectedNode.Text;
string strEmail = string.Empty;
XmlDocument xmlContacts = new XmlDocument();
xmlContacts.Load(Application.StartupPath +"\\My_Contacts.xml");
foreach (XmlNode xmlItem in xmlContacts)
{
foreach (XmlNode newnode in xmlItem)
{
if (newnode["FullName"].InnerText ==
this.treeView_Contacts.SelectedNode.Text)
{
this.txt_Email.Text = newnode["Email"].InnerText;
this.txt_City.Text = newnode["City"].InnerText;
this.txt_Home.Text = newnode["HomePhone"].InnerText;
this.txt_Zip.Text = newnode["ZipCode"].InnerText;
this.txt_Email2.Text = newnode["Email2"].InnerText;
this.txt_Address.Text = newnode["StreetAddress"].InnerText;
this.cmb_State.Text = newnode["State"].InnerText;
this.dt_DateTimePicker.Text = newnode["BDay"].InnerText;
this.txt_Cell.Text = newnode["CellPhone"].InnerText;
}
}
}
}
}
显示 Internet 收藏夹非常简单,只有几个方法用于显示所有内容。我按原样编写这些方法。
private bool LoadWebSitesTree()
{
bool result = false;
try
{
Cursor = Cursors.WaitCursor;
string favFolderPath =
Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
// Disables any redrawing of the tree view till we are done
tvWebSites.BeginUpdate();
LoadFavFromFolder(new DirectoryInfo(favFolderPath), webSitesRootNode);
LoadFavFromPath(favFolderPath, webSitesRootNode);
result = true;
}
catch (Exception exp)
{
//DebugLog.Instance.REPORT(exp);
}
finally
{
Cursor = Cursors.Default;
tvWebSites.EndUpdate();
}
return result;
}
private void LoadFavFromFolder(DirectoryInfo curDirInfo, TreeNode curNode)
{
try
{
TreeNode newNode;
foreach (DirectoryInfo dirInfo in curDirInfo.GetDirectories())
{
if (curNode == null)
newNode = tvWebSites.Nodes.Add(dirInfo.Name);
else
newNode = curNode.Nodes.Add(dirInfo.Name);
if (dirInfo.GetDirectories().Length == 0)
LoadFavFromPath(dirInfo.FullName, newNode);
else
LoadFavFromFolder(dirInfo, newNode);
}
}
catch (Exception exp)
{
//DebugLog.Instance.REPORT(exp);
}
}
private void LoadFavFromPath(string curPath, TreeNode curNode)
{
try
{
DirectoryInfo curDirInfo = new DirectoryInfo(curPath);
foreach (FileInfo objFile in curDirInfo.GetFiles("*.url"))
{
TreeNode newNode = new TreeNode();
string fileName = objFile.FullName;
newNode.Tag = GetURLValue(fileName);
newNode.Text = Path.GetFileNameWithoutExtension(fileName);
newNode.ImageIndex = 2;
newNode.SelectedImageIndex = 2;
if (curNode == null)
tvWebSites.Nodes.Add(newNode);
else
curNode.Nodes.Add(newNode);
}
}
catch (Exception exp)
{
//DebugLog.Instance.REPORT(exp);
}
}
// Reading favorites file as INI file getting the value of URL=
private string GetURLValue(string fileName)
{
string strURL = null;
StreamReader reader = null;
try
{
reader = new StreamReader(fileName);
string fileLine;
int iIndex = -1;
while ((fileLine = reader.ReadLine()) != null)
{
if (fileLine != null)
{
if ((iIndex = fileLine.IndexOf("URL=")) >= 0)
{
strURL = fileLine.Substring(iIndex + 4);
break;
}
}
}
}
catch (Exception exp)
{
//DebugLog.Instance.REPORT(exp);
}
finally
{
try { if (reader != null) reader.Close(); }
catch (Exception exp)
{
//DebugLog.Instance.REPORT(exp);
}
}
return strURL;
}
待办事项
- 任务网格中的打印支持。
- 身份验证后的用户名和密码收集。
- 文本装饰。
干杯!!!